TM-SGNL-iOS/SignalServiceKit/Subscriptions/Donations/DonationReceiptCredentialRedemptionSuccess.swift
TeleMessage developers dde0620daf initial commit
2025-05-03 12:28:28 -07:00

58 lines
2.2 KiB
Swift

//
// Copyright 2023 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
/// Represents a successful receipt credential request and the subsequent
/// redemption of that receipt credential.
///
/// These are persisted in the ``SubscriptionReceiptCredentialRequestResultStore``
/// by the ``DonationReceiptCredentialRedemptionJobQueue``.
public struct DonationReceiptCredentialRedemptionSuccess: Codable {
public let badgesSnapshotBeforeJob: ProfileBadgesSnapshot
public let badge: ProfileBadge
public let paymentMethod: DonationPaymentMethod?
public init(
badgesSnapshotBeforeJob: ProfileBadgesSnapshot,
badge: ProfileBadge,
paymentMethod: DonationPaymentMethod?
) {
self.badgesSnapshotBeforeJob = badgesSnapshotBeforeJob
self.badge = badge
self.paymentMethod = paymentMethod
}
// MARK: - Codable
private enum CodingKeys: String, CodingKey {
case badgesSnapshotBeforeJob
case badge
case paymentMethod
}
public init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
badgesSnapshotBeforeJob = try container.decode(ProfileBadgesSnapshot.self, forKey: .badgesSnapshotBeforeJob)
badge = try container.decode(ProfileBadge.self, forKey: .badge)
paymentMethod = try container.decodeIfPresent(String.self, forKey: .paymentMethod).map { rawValue throws in
guard let paymentMethod = DonationPaymentMethod(rawValue: rawValue) else {
throw DecodingError.dataCorrupted(DecodingError.Context(
codingPath: [CodingKeys.paymentMethod],
debugDescription: "Unexpected payment method raw value: \(rawValue)"
))
}
return paymentMethod
}
}
public func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(badgesSnapshotBeforeJob, forKey: .badgesSnapshotBeforeJob)
try container.encode(badge, forKey: .badge)
try container.encodeIfPresent(paymentMethod?.rawValue, forKey: .paymentMethod)
}
}