78 lines
3.3 KiB
Swift
78 lines
3.3 KiB
Swift
//
|
|
// AccountServiceManual.swift
|
|
// PayCash
|
|
//
|
|
// Created by Igor on 05.03.2021.
|
|
// Copyright © 2021 AM. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
import EosioSwift
|
|
|
|
extension Account.Service {
|
|
class Manual: Common.Service.Provider {
|
|
|
|
private(set) var accounts = [Account.Model.Add]()
|
|
private var requests = 0
|
|
|
|
func fetch(privateKey: String, _ completion: @escaping Completion.Network) {
|
|
guard let publicKey = privateKey.publicKey() else {
|
|
completion(.error(L10n.Error.Accounts.keyInvalid))
|
|
return
|
|
}
|
|
Network.accounts.fetch(publicKey: publicKey) { (collection) in
|
|
if (collection.isEmpty) {
|
|
completion(.error(L10n.Error.Accounts.empty))
|
|
} else {
|
|
self.requests = collection.count
|
|
self.accounts = []
|
|
collection.forEach { username in
|
|
DispatchQueue.global().async {
|
|
Network.accounts.account(username, completion: { response in
|
|
|
|
guard let accountInfo = response else {
|
|
completion(.error(L10n.Error.Accounts.empty))
|
|
return
|
|
}
|
|
let newAccounts = self.prepareAccountInfo(username: username, publicKey: publicKey, accountPermissions: accountInfo.permissions)
|
|
self.accounts += newAccounts
|
|
self.requests -= 1
|
|
|
|
if (self.requests == 0) {
|
|
DispatchQueue.main.async { completion(nil) }
|
|
}
|
|
})
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private func prepareAccountInfo(username: String, publicKey: String, accountPermissions: [Permission]) -> [Account.Model.Add] {
|
|
|
|
let addedAccounts = Accounts().collection
|
|
let permissions = accountPermissions
|
|
.filter { $0.requiredAuth.keys.first?.key == publicKey }
|
|
.sorted { $0.permName > $1.permName }
|
|
|
|
var accounts: [Account.Model.Add] = []
|
|
permissions.forEach { permission in
|
|
let isAccountAdded = addedAccounts.contains(where: {
|
|
$0.username == username && $0.keyType.rawValue == permission.permName
|
|
})
|
|
if (permission.permName == Account.KeyType.owner.rawValue) {
|
|
accounts.append(Account.Model.Add(username: username, permission: permission, isAdded: isAccountAdded))
|
|
}
|
|
let hasAddedOwnerKey = accounts.contains(where: { account in
|
|
account.username == username &&
|
|
account.permission.requiredAuth.keys.first?.key == permission.requiredAuth.keys.first?.key
|
|
})
|
|
if (permission.permName != Account.KeyType.owner.rawValue && !hasAddedOwnerKey) {
|
|
accounts.append(Account.Model.Add(username: username, permission: permission, isAdded: isAccountAdded))
|
|
}
|
|
}
|
|
return accounts
|
|
}
|
|
}
|
|
}
|