mirror of
https://github.com/SideStore/SideStore.git
synced 2026-02-09 06:43:25 +01:00
The Patreon API doesn’t have a way to fetch just the patrons belonging to our Friend Zone tier. Instead, we need to fetch ALL patrons (including inactive ones) and filter out those not in the tier. This is very inefficient, and takes over a minute to complete as of April 14, 2022, due to the number of patrons we have. We can’t do much to change this, but AltStore will now at least cache the fetched patrons with Core Data. Additionally, AltStore will only perform this long fetch whenever the Friend Zone list actually changes, rather than every time the Patreon screen appears.
86 lines
2.1 KiB
Swift
86 lines
2.1 KiB
Swift
//
|
|
// PatreonAccount.swift
|
|
// AltStore
|
|
//
|
|
// Created by Riley Testut on 8/20/19.
|
|
// Copyright © 2019 Riley Testut. All rights reserved.
|
|
//
|
|
|
|
import CoreData
|
|
|
|
extension PatreonAPI
|
|
{
|
|
struct AccountResponse: Decodable
|
|
{
|
|
struct Data: Decodable
|
|
{
|
|
struct Attributes: Decodable
|
|
{
|
|
var first_name: String?
|
|
var full_name: String
|
|
}
|
|
|
|
var id: String
|
|
var attributes: Attributes
|
|
}
|
|
|
|
var data: Data
|
|
var included: [PatronResponse]?
|
|
}
|
|
}
|
|
|
|
@objc(PatreonAccount)
|
|
public class PatreonAccount: NSManagedObject, Fetchable
|
|
{
|
|
@NSManaged public var identifier: String
|
|
|
|
@NSManaged public var name: String
|
|
@NSManaged public var firstName: String?
|
|
|
|
@NSManaged public var isPatron: Bool
|
|
@NSManaged public var isFriendZonePatron: NSNumber?
|
|
|
|
private override init(entity: NSEntityDescription, insertInto context: NSManagedObjectContext?)
|
|
{
|
|
super.init(entity: entity, insertInto: context)
|
|
}
|
|
|
|
init(response: PatreonAPI.AccountResponse, context: NSManagedObjectContext)
|
|
{
|
|
super.init(entity: PatreonAccount.entity(), insertInto: context)
|
|
|
|
self.identifier = response.data.id
|
|
self.name = response.data.attributes.full_name
|
|
self.firstName = response.data.attributes.first_name
|
|
|
|
if let patronResponse = response.included?.first
|
|
{
|
|
let patron = Patron(response: patronResponse)
|
|
self.isPatron = (patron.status == .active)
|
|
}
|
|
else
|
|
{
|
|
self.isPatron = false
|
|
}
|
|
}
|
|
|
|
public init(patron: Patron, context: NSManagedObjectContext)
|
|
{
|
|
super.init(entity: PatreonAccount.entity(), insertInto: context)
|
|
|
|
self.identifier = patron.identifier
|
|
self.name = patron.name
|
|
self.firstName = nil
|
|
self.isPatron = (patron.status == .active)
|
|
}
|
|
}
|
|
|
|
public extension PatreonAccount
|
|
{
|
|
@nonobjc class func fetchRequest() -> NSFetchRequest<PatreonAccount>
|
|
{
|
|
return NSFetchRequest<PatreonAccount>(entityName: "PatreonAccount")
|
|
}
|
|
}
|
|
|