112 lines
4.4 KiB
Swift
112 lines
4.4 KiB
Swift
//
|
|
// CardsService.swift
|
|
// Wallet
|
|
//
|
|
// Created by Igor on 16.12.2020.
|
|
// Copyright © 2020 AM. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
import Alamofire
|
|
|
|
extension Cards {
|
|
class Service {
|
|
|
|
private(set) var collection = [Cards.Model]()
|
|
|
|
var `default`: Cards.Model? {
|
|
get { collection.first }
|
|
set {
|
|
guard let newValue = newValue else { return }
|
|
if let index = collection.lastIndex(where: { $0.uuid == newValue.uuid }) {
|
|
collection.remove(at: index)
|
|
}
|
|
collection.insert(newValue, at: 0)
|
|
save()
|
|
}
|
|
}
|
|
|
|
init() {
|
|
if let data = UserDefaults.standard.value(forKey: "Cards_Service_cards_new") as? Data,
|
|
let objects = try? JSONDecoder().decode([Cards.Model].self, from: data) {
|
|
collection = objects
|
|
}
|
|
cardsMigration()
|
|
}
|
|
|
|
func save(card: Cards.Model) {
|
|
if let index = collection.lastIndex(where: { $0.uuid == card.uuid }) {
|
|
collection.remove(at: index)
|
|
collection.insert(card, at: index)
|
|
} else {
|
|
collection.append(card)
|
|
}
|
|
save()
|
|
}
|
|
|
|
func delete(card: Cards.Model) {
|
|
collection.removeAll(where: { $0.uuid == card.uuid })
|
|
save()
|
|
}
|
|
|
|
private func save() {
|
|
guard let data = try? JSONEncoder().encode(collection) else { return }
|
|
UserDefaults.standard.setValue(data, forKey: "Cards_Service_cards_new")
|
|
UserDefaults.standard.synchronize()
|
|
}
|
|
|
|
enum Menu: String {
|
|
case edit
|
|
case primary
|
|
case delete
|
|
var title: String { "cards.menu.\(rawValue)".localized }
|
|
}
|
|
|
|
func menu(for card: Cards.Model) -> [Menu] {
|
|
`default`?.uuid == card.uuid ? [.edit, .delete] : [.edit, .primary, .delete]
|
|
}
|
|
|
|
private func cardsMigration() {
|
|
if let data = UserDefaults.standard.value(forKey: "Cards_Service_cards") as? Data,
|
|
let objects = try? JSONDecoder().decode([Cards.OldModel].self, from: data), !objects.isEmpty {
|
|
|
|
let environment = ApplicationEnvironment.shared().current
|
|
AF.request(
|
|
environment.backend.urlPath,
|
|
method: .post,
|
|
parameters: P2PCardsGraphQLRequest(variables: P2PCardsGraphQLRequest.Variables(iins: Array(Set(objects.map({ Cards.Model.cleaned(number: $0.number) }))))),
|
|
encoder: JSONParameterEncoder.default,
|
|
headers: HTTPHeaders(environment.headers)
|
|
).responseDecodable(of: GraphQLResponse<P2PCardsGraphQLRequest.ResponseData>.self) { response in
|
|
switch response.result {
|
|
case let .success(value):
|
|
if let error = value.errorsDescription {
|
|
print(error)
|
|
} else {
|
|
for card in value.data?.checkBankCards?.cards ?? [] {
|
|
if let cardOld = objects.first(where: { Cards.Model.cleaned(number: $0.number) == Cards.Model.cleaned(number: card.cardNumber) }),
|
|
!self.collection.contains(where: { Cards.Model.cleaned(number: $0.number) == Cards.Model.cleaned(number: cardOld.number) }) {
|
|
|
|
let type = Cards.Model.Kind(rawValue: card.brand ?? "") ?? .UNKNOWN
|
|
|
|
self.collection.append(Cards.Model(uuid: cardOld.uuid, number: cardOld.number, countryId: card.countryId, country: card.country, bankId: card.bankId, bank: card.bank.name, type: type))
|
|
}
|
|
}
|
|
self.save()
|
|
if value.data?.checkBankCards?.cards.count == Set(objects.map({ Cards.Model.cleaned(number: $0.number) })).count {
|
|
UserDefaults.standard.removeObject(forKey: "Cards_Service_cards")
|
|
}
|
|
}
|
|
case let .failure(error):
|
|
print(error)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
extension Cards.Service.Menu: CommonMenuMappable {
|
|
func toMenu() -> Common.Model.Menu { .menu(uuid: rawValue, title: title)}
|
|
}
|