Files
2022-12-21 20:26:26 +03:00

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)}
}