[AltStoreCore] Updates StoreApp to support Patreon-exclusive apps

This commit is contained in:
Riley Testut
2023-11-15 13:41:05 -06:00
committed by Magesh K
parent 869b2dc92a
commit 6ba642335b
3 changed files with 59 additions and 2 deletions

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="22222" systemVersion="22G91" minimumToolsVersion="Automatic" sourceLanguage="Swift" userDefinedModelVersionIdentifier=""> <model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="22225" systemVersion="22G91" minimumToolsVersion="Automatic" sourceLanguage="Swift" userDefinedModelVersionIdentifier="">
<entity name="Account" representedClassName="Account" syncable="YES"> <entity name="Account" representedClassName="Account" syncable="YES">
<attribute name="appleID" attributeType="String"/> <attribute name="appleID" attributeType="String"/>
<attribute name="firstName" attributeType="String"/> <attribute name="firstName" attributeType="String"/>
@@ -188,6 +188,7 @@
<attribute name="identifier" attributeType="String"/> <attribute name="identifier" attributeType="String"/>
<attribute name="localizedDescription" optional="YES" attributeType="String"/> <attribute name="localizedDescription" optional="YES" attributeType="String"/>
<attribute name="name" attributeType="String"/> <attribute name="name" attributeType="String"/>
<attribute name="patreonURL" optional="YES" attributeType="URI"/>
<attribute name="sourceURL" attributeType="URI"/> <attribute name="sourceURL" attributeType="URI"/>
<attribute name="subtitle" optional="YES" attributeType="String"/> <attribute name="subtitle" optional="YES" attributeType="String"/>
<attribute name="tintColor" optional="YES" attributeType="Transformable" valueTransformerName="ALTSecureValueTransformer"/> <attribute name="tintColor" optional="YES" attributeType="Transformable" valueTransformerName="ALTSecureValueTransformer"/>
@@ -207,8 +208,13 @@
<attribute name="downloadURL" attributeType="URI"/> <attribute name="downloadURL" attributeType="URI"/>
<attribute name="iconURL" attributeType="URI"/> <attribute name="iconURL" attributeType="URI"/>
<attribute name="isBeta" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/> <attribute name="isBeta" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
<attribute name="isHiddenWithoutPledge" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
<attribute name="isPledged" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
<attribute name="isPledgeRequired" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
<attribute name="localizedDescription" attributeType="String"/> <attribute name="localizedDescription" attributeType="String"/>
<attribute name="name" attributeType="String"/> <attribute name="name" attributeType="String"/>
<attribute name="pledgeAmount" optional="YES" attributeType="Decimal"/>
<attribute name="pledgeCurrency" optional="YES" attributeType="String"/>
<attribute name="screenshotURLs" attributeType="Transformable" valueTransformerName="ALTSecureValueTransformer"/> <attribute name="screenshotURLs" attributeType="Transformable" valueTransformerName="ALTSecureValueTransformer"/>
<attribute name="size" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="YES"/> <attribute name="size" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="YES"/>
<attribute name="sortIndex" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="YES"/> <attribute name="sortIndex" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="YES"/>

View File

@@ -203,8 +203,9 @@ public class Source: NSManagedObject, Fetchable, Decodable
/* Source Detail */ /* Source Detail */
@NSManaged public var subtitle: String? @NSManaged public var subtitle: String?
@NSManaged public var websiteURL: URL?
@NSManaged public var localizedDescription: String? @NSManaged public var localizedDescription: String?
@NSManaged public var websiteURL: URL?
@NSManaged public var patreonURL: URL?
// Optional properties with fallbacks. // Optional properties with fallbacks.
// `private` to prevent accidentally using instead of `effective[PropertyName]` // `private` to prevent accidentally using instead of `effective[PropertyName]`
@@ -257,6 +258,7 @@ public class Source: NSManagedObject, Fetchable, Decodable
case headerImageURL = "headerURL" case headerImageURL = "headerURL"
case websiteURL = "website" case websiteURL = "website"
case tintColor case tintColor
case patreonURL
case apps case apps
case news case news
@@ -287,6 +289,7 @@ public class Source: NSManagedObject, Fetchable, Decodable
self.localizedDescription = try container.decodeIfPresent(String.self, forKey: .localizedDescription) self.localizedDescription = try container.decodeIfPresent(String.self, forKey: .localizedDescription)
self.iconURL = try container.decodeIfPresent(URL.self, forKey: .iconURL) self.iconURL = try container.decodeIfPresent(URL.self, forKey: .iconURL)
self.headerImageURL = try container.decodeIfPresent(URL.self, forKey: .headerImageURL) self.headerImageURL = try container.decodeIfPresent(URL.self, forKey: .headerImageURL)
self.patreonURL = try container.decodeIfPresent(URL.self, forKey: .patreonURL)
if let tintColorHex = try container.decodeIfPresent(String.self, forKey: .tintColor) if let tintColorHex = try container.decodeIfPresent(String.self, forKey: .tintColor)
{ {

View File

@@ -91,6 +91,18 @@ extension PlatformURL: Comparable {
public typealias PlatformURLs = [PlatformURL] public typealias PlatformURLs = [PlatformURL]
extension StoreApp
{
private struct PatreonParameters: Decodable
{
var pledge: Decimal?
var currency: String?
var tiers: Set<String>?
var benefit: String?
var hidden: Bool?
}
}
@objc(StoreApp) @objc(StoreApp)
public class StoreApp: NSManagedObject, Decodable, Fetchable public class StoreApp: NSManagedObject, Decodable, Fetchable
{ {
@@ -112,6 +124,14 @@ public class StoreApp: NSManagedObject, Decodable, Fetchable
@NSManaged public private(set) var tintColor: UIColor? @NSManaged public private(set) var tintColor: UIColor?
@NSManaged public private(set) var isBeta: Bool @NSManaged public private(set) var isBeta: Bool
@NSManaged public var isPledged: Bool
@NSManaged public private(set) var isPledgeRequired: Bool
@NSManaged public private(set) var isHiddenWithoutPledge: Bool
@NSManaged public private(set) var pledgeCurrency: String?
@nonobjc public var pledgeAmount: Decimal? { _pledgeAmount as? Decimal }
@NSManaged @objc(pledgeAmount) private var _pledgeAmount: NSDecimalNumber?
@NSManaged public var sortIndex: Int32 @NSManaged public var sortIndex: Int32
@objc public internal(set) var sourceIdentifier: String? { @objc public internal(set) var sourceIdentifier: String? {
@@ -232,6 +252,7 @@ public class StoreApp: NSManagedObject, Decodable, Fetchable
case size case size
case isBeta = "beta" case isBeta = "beta"
case versions case versions
case patreon
// Legacy // Legacy
case version case version
@@ -380,6 +401,33 @@ public class StoreApp: NSManagedObject, Decodable, Fetchable
in: context) in: context)
try self.setVersions([appVersion]) try self.setVersions([appVersion])
} }
// Must _explicitly_ set to false to ensure it updates cached database value.
self.isPledged = false
if let patreon = try container.decodeIfPresent(PatreonParameters.self, forKey: .patreon)
{
self.isPledgeRequired = true
self.isHiddenWithoutPledge = patreon.hidden ?? false // Default to showing Patreon apps
if let pledge = patreon.pledge
{
self._pledgeAmount = pledge as NSDecimalNumber
self.pledgeCurrency = patreon.currency ?? "USD" // Only set pledge currency if explicitly given pledge.
}
else if patreon.pledge == nil && patreon.tiers == nil && patreon.benefit == nil
{
// No conditions, so default to pledgeAmount of 0 to simplify logic.
self._pledgeAmount = 0 as NSDecimalNumber
}
}
else
{
self.isPledgeRequired = false
self.isHiddenWithoutPledge = false
self._pledgeAmount = nil
self.pledgeCurrency = nil
}
} }
catch catch
{ {