Files
raspberry/iOS/Wallet/Sources/CCCP/Service/CCCPServiceExchangeRequests.swift
2022-05-27 20:21:01 +03:00

150 lines
5.1 KiB
Swift

//
// CCCPServiceExchangeRequests.swift
// PayCash
//
// Created by Saveliy Stavitsky on 8/5/20.
// Copyright © 2020 List. All rights reserved.
//
import Foundation
import Alamofire
extension Notification.Name {
static let didUpdateCryptocashExchangeRequests = Notification.Name("CCCP.Service.ExchangeRequests.didUpdate")
}
extension CCCP.Service {
class ExchangeRequests {
enum RequestsType {
case outgoingRequests
case incomingRequests
case soldRequests
}
var type: RequestsType
init(type: RequestsType = .outgoingRequests) {
self.type = type
}
private let serialQueue = DispatchQueue(label: "paycash.serial.queue.CCCP.Service.ExchangeRequests.requests")
private var allRequests = [CCCP.Model.ExchangeRequest]() {
didSet {
if !isLoading {
Notification.post(name: .didUpdateCryptocashExchangeRequests)
}
}
}
private var newRequests = [CCCP.Model.ExchangeRequest]() {
didSet {
if !isLoading {
allRequests = newRequests
}
}
}
var urgentMyDebts: [CCCP.Model.ExchangeRequest] {
allRequests
.filter(\.isDebt)
.filter({ $0.isOwner && !$0.isExpired })
.sorted(by: { $0.expirationDate < $1.expirationDate })
}
var requests: [CCCP.Model.ExchangeRequest] {
urgentMyDebts + allRequests
.filter({ !$0.isDebt })
.sorted(by: { $0.expirationDate < $1.expirationDate })
}
var debts: [CCCP.Model.ExchangeRequest] {
allRequests
.filter(\.isDebt)
.filter({ $0.isOwner && $0.isExpired })
.sorted(by: { $0.expirationDate < $1.expirationDate })
+ allRequests
.filter(\.isDebt)
.filter({ !$0.isOwner && $0.isExpired })
.sorted(by: { $0.expirationDate < $1.expirationDate })
}
private let perPage = 1000
private var isLoadingCounter = 0
private var isLoading: Bool { isLoadingCounter != 0 }
func fetch() {
guard
!isLoading,
let username = Accounts().current?.username
else { return }
self.isLoadingCounter = Wallet.Service.Tokens.shared.cashTokens.count * 3
self.newRequests = []
let account = username.rangeOfCharacter(from: CharacterSet.decimalDigits.inverted) == nil
? username + "."
: username
for cashToken in Wallet.Service.Tokens.shared.cashTokens {
Network.table.fetch(
code: Network.servers.current.contract(.cash),
table: "requests",
scope: cashToken.symbol,
limit: self.perPage,
encodeType: .dec,
reverse: false,
showPayer: false,
keyType: "i64",
indexPosition: "3",
lowerBound: account,
upperBound: account,
type: CCCP.Model.ExchangeRequest.self
) { rows in
print("success: \(self.isLoadingCounter), \(rows.count)")
self.serialQueue.async {
self.isLoadingCounter -= 1
self.newRequests += rows
}
}
Network.table.fetch(
code: Network.servers.current.contract(.cash),
table: "requests",
scope: cashToken.symbol,
limit: self.perPage,
encodeType: .dec,
reverse: false,
showPayer: false,
keyType: "i64",
indexPosition: "2",
lowerBound: account,
upperBound: account,
type: CCCP.Model.ExchangeRequest.self
) { rows in
print("success: \(self.isLoadingCounter), \(rows.count)")
self.serialQueue.async {
self.isLoadingCounter -= 1
self.newRequests += rows
}
}
Network.table.fetch(
code: Network.servers.current.contract(.cash),
table: "debts",
scope: cashToken.symbol,
limit: self.perPage,
encodeType: .dec,
reverse: false,
showPayer: false,
type: CCCP.Model.ExchangeRequest.self
) { rows in
print("success: \(self.isLoadingCounter), \(rows.count)")
self.serialQueue.async {
self.isLoadingCounter -= 1
self.newRequests += rows
}
}
}
}
}
}