83 lines
2.4 KiB
Swift
83 lines
2.4 KiB
Swift
import Foundation
|
|
import CoreData
|
|
|
|
@objc(PremiumStatus)
|
|
public class PremiumStatus: NSManagedObject, Identifiable {
|
|
@nonobjc public class func fetchRequest() -> NSFetchRequest<PremiumStatus> {
|
|
return NSFetchRequest<PremiumStatus>(entityName: "PremiumStatus")
|
|
}
|
|
|
|
@NSManaged public var id: UUID
|
|
@NSManaged public var isPremium: Bool
|
|
@NSManaged public var purchaseDate: Date?
|
|
@NSManaged public var productIdentifier: String?
|
|
@NSManaged public var transactionId: String?
|
|
@NSManaged public var isFamilyShared: Bool
|
|
@NSManaged public var lastVerificationDate: Date?
|
|
@NSManaged public var originalPurchaseDate: Date?
|
|
|
|
public override func awakeFromInsert() {
|
|
super.awakeFromInsert()
|
|
id = UUID()
|
|
isPremium = false
|
|
isFamilyShared = false
|
|
}
|
|
}
|
|
|
|
// MARK: - Computed Properties
|
|
|
|
extension PremiumStatus {
|
|
var daysSincePurchase: Int? {
|
|
guard let purchaseDate = purchaseDate else { return nil }
|
|
return Calendar.current.dateComponents([.day], from: purchaseDate, to: Date()).day
|
|
}
|
|
|
|
var needsVerification: Bool {
|
|
guard let lastVerification = lastVerificationDate else { return true }
|
|
let hoursSinceVerification = Calendar.current.dateComponents(
|
|
[.hour],
|
|
from: lastVerification,
|
|
to: Date()
|
|
).hour ?? 0
|
|
return hoursSinceVerification >= 24
|
|
}
|
|
}
|
|
|
|
// MARK: - Static Helpers
|
|
|
|
extension PremiumStatus {
|
|
static func getOrCreate(in context: NSManagedObjectContext) -> PremiumStatus {
|
|
let request: NSFetchRequest<PremiumStatus> = PremiumStatus.fetchRequest()
|
|
request.fetchLimit = 1
|
|
|
|
if let existing = try? context.fetch(request).first {
|
|
return existing
|
|
}
|
|
|
|
let new = PremiumStatus(context: context)
|
|
try? context.save()
|
|
return new
|
|
}
|
|
|
|
static func updateStatus(
|
|
isPremium: Bool,
|
|
productIdentifier: String?,
|
|
transactionId: String?,
|
|
isFamilyShared: Bool,
|
|
in context: NSManagedObjectContext
|
|
) {
|
|
let status = getOrCreate(in: context)
|
|
status.isPremium = isPremium
|
|
status.productIdentifier = productIdentifier
|
|
status.transactionId = transactionId
|
|
status.isFamilyShared = isFamilyShared
|
|
status.lastVerificationDate = Date()
|
|
|
|
if isPremium && status.purchaseDate == nil {
|
|
status.purchaseDate = Date()
|
|
}
|
|
|
|
try? context.save()
|
|
}
|
|
}
|