Skip to content
Snippets Groups Projects
Commit 55eb1556 authored by Bruno Muniz's avatar Bruno Muniz :apple:
Browse files

updated backup service

parent f9330de5
No related branches found
No related tags found
1 merge request!66Using new client wrapper
...@@ -19,19 +19,26 @@ public final class BackupService { ...@@ -19,19 +19,26 @@ public final class BackupService {
@KeyObject(.username, defaultValue: nil) var username: String? @KeyObject(.username, defaultValue: nil) var username: String?
@KeyObject(.backupSettings, defaultValue: nil) var storedSettings: Data? @KeyObject(.backupSettings, defaultValue: nil) var storedSettings: Data?
public var backupsPublisher: AnyPublisher<[CloudService: Fetch.Metadata], Never> {
backupSubject.eraseToAnyPublisher()
}
public var connectedServicesPublisher: AnyPublisher<Set<CloudService>, Never> {
connectedServicesSubject.eraseToAnyPublisher()
}
public var settingsPublisher: AnyPublisher<CloudSettings, Never> { public var settingsPublisher: AnyPublisher<CloudSettings, Never> {
settings.handleEvents(receiveSubscription: { [weak self] _ in settings.handleEvents(receiveSubscription: { [weak self] _ in
guard let self = self else { return } guard let self = self else { return }
self.settings.value.connectedServices = CloudFilesManager.all.linkedServices() self.connectedServicesSubject.send(CloudFilesManager.all.linkedServices())
CloudFilesManager.all.lastBackups { [weak self] in self.fetchBackupOnAllProviders()
guard let self else { return }
self.settings.value.backups = $0
}
}).eraseToAnyPublisher() }).eraseToAnyPublisher()
} }
private var connType: ConnectionType = .wifi private var connType: ConnectionType = .wifi
private var cancellables = Set<AnyCancellable>() private var cancellables = Set<AnyCancellable>()
private let connectedServicesSubject = CurrentValueSubject<Set<CloudService>, Never>([])
private let backupSubject = CurrentValueSubject<[CloudService: Fetch.Metadata], Never>([:])
private lazy var settings = CurrentValueSubject<CloudSettings, Never>(.init(fromData: storedSettings)) private lazy var settings = CurrentValueSubject<CloudSettings, Never>(.init(fromData: storedSettings))
public init() { public init() {
...@@ -167,10 +174,11 @@ public final class BackupService { ...@@ -167,10 +174,11 @@ public final class BackupService {
CloudFilesManager.all[.sftp] = sftpManager CloudFilesManager.all[.sftp] = sftpManager
do { do {
try sftpManager.fetch { try sftpManager.fetch { [weak self] in
guard let self else { return }
switch $0 { switch $0 {
case .success(let metadata): case .success(let metadata):
self.settings.value.backups[.sftp] = metadata self.backupSubject.value[.sftp] = metadata
case .failure(let error): case .failure(let error):
print(">>> Error fetching sftp: \(error.localizedDescription)") print(">>> Error fetching sftp: \(error.localizedDescription)")
} }
...@@ -184,17 +192,31 @@ public final class BackupService { ...@@ -184,17 +192,31 @@ public final class BackupService {
service: CloudService, service: CloudService,
presenting screen: UIViewController presenting screen: UIViewController
) { ) {
service.authorize(presenting: screen) { guard let manager = CloudFilesManager.all[service] else {
switch $0 { print(">>> Tried to link/auth but the enabled service is not set")
case .success: return
self.settings.value.connectedServices = CloudFilesManager.all.linkedServices() }
CloudFilesManager.all.lastBackups { [weak self] in do {
guard let self else { return } try manager.link(screen) { [weak self] in
self.settings.value.backups = $0 guard let self else { return }
switch $0 {
case .success:
self.connectedServicesSubject.value.insert(service)
self.fetchBackupOnAllProviders()
case .failure(let error):
self.connectedServicesSubject.value.remove(service)
print(">>> Failed to link/auth \(service): \(error.localizedDescription)")
} }
case .failure(let error):
print(">>> Tried to authorize \(service) but failed: \(error.localizedDescription)")
} }
} catch {
print(">>> Exception trying to link/auth \(service): \(error.localizedDescription)")
}
}
func fetchBackupOnAllProviders() {
CloudFilesManager.all.lastBackups { [weak self] in
guard let self else { return }
self.backupSubject.send($0)
} }
} }
...@@ -202,7 +224,6 @@ public final class BackupService { ...@@ -202,7 +224,6 @@ public final class BackupService {
guard let enabledService = settings.value.enabledService else { guard let enabledService = settings.value.enabledService else {
fatalError(">>> Trying to backup but nothing is enabled") fatalError(">>> Trying to backup but nothing is enabled")
} }
if enabledService == .sftp { if enabledService == .sftp {
let keychain = Keychain(service: "SFTP-XXM") let keychain = Keychain(service: "SFTP-XXM")
guard let host = try? keychain.get("host"), guard let host = try? keychain.get("host"),
...@@ -210,7 +231,6 @@ public final class BackupService { ...@@ -210,7 +231,6 @@ public final class BackupService {
let username = try? keychain.get("username") else { let username = try? keychain.get("username") else {
fatalError(">>> Tried to perform an sftp backup but its not configured") fatalError(">>> Tried to perform an sftp backup but its not configured")
} }
CloudFilesManager.all[.sftp] = .sftp( CloudFilesManager.all[.sftp] = .sftp(
host: host, host: host,
username: username, username: username,
...@@ -218,17 +238,26 @@ public final class BackupService { ...@@ -218,17 +238,26 @@ public final class BackupService {
fileName: "backup.xxm" fileName: "backup.xxm"
) )
} }
guard let manager = CloudFilesManager.all[enabledService] else {
print(">>> Tried to upload but the enabled service is not set")
return
}
do {
try manager.upload(data) { [weak self] in
guard let self else { return }
enabledService.backup(data: data) { switch $0 {
switch $0 { case .success(let metadata):
case .success(let metadata): self.backupSubject.value[enabledService] = .init(
self.settings.value.backups[enabledService] = .init( size: metadata.size,
size: metadata.size, lastModified: metadata.lastModified
lastModified: metadata.lastModified )
) case .failure(let error):
case .failure(let error): print(">>> Failed to perform a backup upload: \(error.localizedDescription)")
print(">>> Failed to perform a backup upload: \(error.localizedDescription)") }
} }
} catch {
print(">>> Exception performing a backup upload: \(error.localizedDescription)")
} }
} }
......
...@@ -89,9 +89,10 @@ extension BackupConfigViewModel { ...@@ -89,9 +89,10 @@ extension BackupConfigViewModel {
}, },
lastBackup: { lastBackup: {
context.service.settingsPublisher context.service.settingsPublisher
.map { .combineLatest(context.service.backupsPublisher)
guard let enabledService = $0.enabledService else { return nil } .map { settings, backups in
return $0.backups[enabledService] guard let enabled = settings.enabledService else { return nil }
return backups[enabled]
}.eraseToAnyPublisher() }.eraseToAnyPublisher()
}, },
actionState: { actionState: {
...@@ -106,8 +107,7 @@ extension BackupConfigViewModel { ...@@ -106,8 +107,7 @@ extension BackupConfigViewModel {
.eraseToAnyPublisher() .eraseToAnyPublisher()
}, },
connectedServices: { connectedServices: {
context.service.settingsPublisher context.service.connectedServicesPublisher
.map(\.connectedServices)
.removeDuplicates() .removeDuplicates()
.eraseToAnyPublisher() .eraseToAnyPublisher()
} }
......
...@@ -25,8 +25,7 @@ extension BackupViewModel { ...@@ -25,8 +25,7 @@ extension BackupViewModel {
setupViewModel: { BackupSetupViewModel.live() }, setupViewModel: { BackupSetupViewModel.live() },
configViewModel: { BackupConfigViewModel.live() }, configViewModel: { BackupConfigViewModel.live() },
state: { state: {
context.service.settingsPublisher context.service.connectedServicesPublisher
.map(\.connectedServices)
.map { $0.isEmpty ? BackupViewState.setup : .config } .map { $0.isEmpty ? BackupViewState.setup : .config }
.eraseToAnyPublisher() .eraseToAnyPublisher()
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment