150 lines
5.1 KiB
Swift
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
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|