46 lines
1.6 KiB
Swift
46 lines
1.6 KiB
Swift
//
|
|
// AccountManager.swift
|
|
// Nextcloud Cookbook iOS Client
|
|
//
|
|
// Created by Vincent Meilinger on 16.01.25.
|
|
//
|
|
|
|
import Foundation
|
|
|
|
@Observable
|
|
class AccountManager {
|
|
var accounts: [any Account] = []
|
|
var authTokens: [String: String] = [:]
|
|
|
|
/// Save account as JSON.
|
|
func save(account: any Account, authToken: String?) async throws {
|
|
account.saveTokenToKeychain(authToken!)
|
|
let data = try JSONEncoder().encode(account)
|
|
|
|
let accountDir = account.accountType.rawValue + "/" + account.id.uuidString + "/account.json"
|
|
await DataStore.shared.save(data: data, toPath: accountDir)
|
|
}
|
|
|
|
/// Load accounts from JSON files.
|
|
func loadAccounts() async throws {
|
|
// Read data from file or user defaults
|
|
for accountType in AccountType.allCases {
|
|
// List all account UUIDs under the /accountType directory
|
|
let accountUUIDs = DataStore.shared.listAllFolders(dir: accountType.rawValue + "/")
|
|
|
|
// Decode each account and fetch the authToken
|
|
for accountUUID in accountUUIDs {
|
|
do {
|
|
guard let account = try await DataStore.shared.loadDynamic(fromPath: accountType.rawValue + "/" + accountUUID + "/account.json", type: accountType.accountType) else {
|
|
continue
|
|
}
|
|
authTokens[accountUUID] = (account as! any Account).getTokenFromKeychain() ?? ""
|
|
self.accounts.append(account as! (any Account))
|
|
} catch {
|
|
continue
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|