58 lines
2.2 KiB
Swift
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)
|
|
}
|
|
}
|