Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
signalapp
GitHub Repository: signalapp/Signal-iOS
Path: blob/main/SignalServiceKit/Subscriptions/Donations/DonationReceiptCredentialRedemptionSuccess.swift
1 views
//
// 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)
    }
}