105 lines
3.2 KiB
Swift
105 lines
3.2 KiB
Swift
//
|
|
// Copyright 2023 Signal Messenger, LLC
|
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
//
|
|
|
|
import Foundation
|
|
|
|
public extension OWSRequestFactory {
|
|
enum StripePaymentMethod {
|
|
public enum BankTransfer: String {
|
|
case sepa = "SEPA_DEBIT"
|
|
case ideal = "IDEAL"
|
|
}
|
|
|
|
case card
|
|
case bankTransfer(BankTransfer)
|
|
|
|
fileprivate var rawValue: String {
|
|
switch self {
|
|
case .card:
|
|
return "CARD"
|
|
case .bankTransfer(let bankTransfer):
|
|
return bankTransfer.rawValue
|
|
}
|
|
}
|
|
}
|
|
|
|
private enum BoostApiPaths {
|
|
private static let basePath = "v1/subscription/boost"
|
|
|
|
static let stripeCreatePaymentIntent = "\(basePath)/create"
|
|
static let paypalCreatePayment = "\(basePath)/paypal/create"
|
|
static let paypalConfirmPayment = "\(basePath)/paypal/confirm"
|
|
}
|
|
|
|
/// A request to create a Stripe payment intent for a boost.
|
|
static func boostStripeCreatePaymentIntent(
|
|
integerMoneyValue: UInt,
|
|
inCurrencyCode currencyCode: Currency.Code,
|
|
level: UInt64,
|
|
paymentMethod: StripePaymentMethod,
|
|
) -> TSRequest {
|
|
var request = TSRequest(
|
|
url: URL(string: BoostApiPaths.stripeCreatePaymentIntent)!,
|
|
method: HTTPMethod.post.methodName,
|
|
parameters: [
|
|
"currency": currencyCode.lowercased(),
|
|
"amount": integerMoneyValue,
|
|
"level": level,
|
|
"paymentMethod": paymentMethod.rawValue,
|
|
],
|
|
)
|
|
request.auth = .anonymous
|
|
return request
|
|
}
|
|
|
|
/// A request to create a PayPal payment for a boost.
|
|
static func boostPaypalCreatePayment(
|
|
integerMoneyValue: UInt,
|
|
inCurrencyCode currencyCode: Currency.Code,
|
|
level: UInt64,
|
|
returnUrl: URL,
|
|
cancelUrl: URL,
|
|
) -> TSRequest {
|
|
var request = TSRequest(
|
|
url: URL(string: BoostApiPaths.paypalCreatePayment)!,
|
|
method: HTTPMethod.post.methodName,
|
|
parameters: [
|
|
"currency": currencyCode.lowercased(),
|
|
"amount": integerMoneyValue,
|
|
"level": level,
|
|
"returnUrl": returnUrl.absoluteString,
|
|
"cancelUrl": cancelUrl.absoluteString,
|
|
],
|
|
)
|
|
request.auth = .anonymous
|
|
return request
|
|
}
|
|
|
|
/// A request to confirm a PayPal payment for a one-time payment.
|
|
static func oneTimePaypalConfirmPayment(
|
|
integerMoneyValue: UInt,
|
|
inCurrencyCode currencyCode: Currency.Code,
|
|
level: UInt64,
|
|
payerId: String,
|
|
paymentId: String,
|
|
paymentToken: String,
|
|
) -> TSRequest {
|
|
var request = TSRequest(
|
|
url: URL(string: BoostApiPaths.paypalConfirmPayment)!,
|
|
method: HTTPMethod.post.methodName,
|
|
parameters: [
|
|
"currency": currencyCode.lowercased(),
|
|
"amount": integerMoneyValue,
|
|
"level": level,
|
|
"payerId": payerId,
|
|
"paymentId": paymentId,
|
|
"paymentToken": paymentToken,
|
|
],
|
|
)
|
|
request.auth = .anonymous
|
|
return request
|
|
}
|
|
}
|