From 99489b9b4c1879aa86ee7873c8f94517cabf0ee6 Mon Sep 17 00:00:00 2001 From: Abdullah Atta Date: Tue, 7 Jul 2026 09:20:24 +0500 Subject: [PATCH] common: remove internal paddle related code --- .../Models/GetCustomerResponse.cs | 21 - .../Models/GetSubscriptionResponse.cs | 214 -------- .../Models/GetTransactionInvoiceResponse.cs | 21 - .../Models/GetTransactionResponse.cs | 15 - .../Models/ListPaymentsResponse.cs | 41 -- .../Models/ListTransactionsResponse.cs | 77 --- .../Models/ListTransactionsResponseV2.cs | 511 ------------------ .../Models/ListUsersResponse.cs | 47 -- Streetwriters.Common/Models/PaddleResponse.cs | 24 - .../Models/RefundPaymentResponse.cs | 20 - .../Models/SubscriptionPreviewResponse.cs | 57 -- .../Services/PaddleBillingService.cs | 138 ----- .../Services/PaddleService.cs | 188 ------- 13 files changed, 1374 deletions(-) delete mode 100644 Streetwriters.Common/Models/GetCustomerResponse.cs delete mode 100644 Streetwriters.Common/Models/GetSubscriptionResponse.cs delete mode 100644 Streetwriters.Common/Models/GetTransactionInvoiceResponse.cs delete mode 100644 Streetwriters.Common/Models/GetTransactionResponse.cs delete mode 100644 Streetwriters.Common/Models/ListPaymentsResponse.cs delete mode 100644 Streetwriters.Common/Models/ListTransactionsResponse.cs delete mode 100644 Streetwriters.Common/Models/ListTransactionsResponseV2.cs delete mode 100644 Streetwriters.Common/Models/ListUsersResponse.cs delete mode 100644 Streetwriters.Common/Models/PaddleResponse.cs delete mode 100644 Streetwriters.Common/Models/RefundPaymentResponse.cs delete mode 100644 Streetwriters.Common/Models/SubscriptionPreviewResponse.cs delete mode 100644 Streetwriters.Common/Services/PaddleBillingService.cs delete mode 100644 Streetwriters.Common/Services/PaddleService.cs diff --git a/Streetwriters.Common/Models/GetCustomerResponse.cs b/Streetwriters.Common/Models/GetCustomerResponse.cs deleted file mode 100644 index bbcbb8e..0000000 --- a/Streetwriters.Common/Models/GetCustomerResponse.cs +++ /dev/null @@ -1,21 +0,0 @@ -namespace Streetwriters.Common.Models -{ - using System; - using System.Collections.Generic; - - using System.Text.Json; - using System.Text.Json.Serialization; - using System.Globalization; - - public partial class GetCustomerResponse : PaddleResponse - { - [JsonPropertyName("data")] - public PaddleCustomer? Customer { get; set; } - } - - public class PaddleCustomer - { - [JsonPropertyName("email")] - public string? Email { get; set; } - } -} diff --git a/Streetwriters.Common/Models/GetSubscriptionResponse.cs b/Streetwriters.Common/Models/GetSubscriptionResponse.cs deleted file mode 100644 index d1e217a..0000000 --- a/Streetwriters.Common/Models/GetSubscriptionResponse.cs +++ /dev/null @@ -1,214 +0,0 @@ -namespace Streetwriters.Common.Models -{ - using System; - using System.Collections.Generic; - - using System.Text.Json; - using System.Text.Json.Serialization; - using System.Globalization; - - public partial class GetSubscriptionResponse : PaddleResponse - { - [JsonPropertyName("data")] - public Data? Data { get; set; } - } - - public partial class Data - { - // [JsonPropertyName("id")] - // public string Id { get; set; } - - // [JsonPropertyName("status")] - // public string Status { get; set; } - - [JsonPropertyName("customer_id")] - public string? CustomerId { get; set; } - - // [JsonPropertyName("address_id")] - // public string AddressId { get; set; } - - // [JsonPropertyName("business_id")] - // public object BusinessId { get; set; } - - // [JsonPropertyName("currency_code")] - // public string CurrencyCode { get; set; } - - // [JsonPropertyName("created_at")] - // public DateTimeOffset CreatedAt { get; set; } - - // [JsonPropertyName("updated_at")] - // public DateTimeOffset UpdatedAt { get; set; } - - // [JsonPropertyName("started_at")] - // public DateTimeOffset StartedAt { get; set; } - - [JsonPropertyName("first_billed_at")] - public DateTimeOffset? FirstBilledAt { get; set; } - - // [JsonPropertyName("next_billed_at")] - // public DateTimeOffset NextBilledAt { get; set; } - - // [JsonPropertyName("paused_at")] - // public object PausedAt { get; set; } - - // [JsonPropertyName("canceled_at")] - // public object CanceledAt { get; set; } - - // [JsonPropertyName("collection_mode")] - // public string CollectionMode { get; set; } - - // [JsonPropertyName("billing_details")] - // public object BillingDetails { get; set; } - - // [JsonPropertyName("current_billing_period")] - // public CurrentBillingPeriod CurrentBillingPeriod { get; set; } - - [JsonPropertyName("billing_cycle")] - public BillingCycle? BillingCycle { get; set; } - - // [JsonPropertyName("scheduled_change")] - // public object ScheduledChange { get; set; } - - // [JsonPropertyName("items")] - // public Item[] Items { get; set; } - - // [JsonPropertyName("custom_data")] - // public object CustomData { get; set; } - - [JsonPropertyName("management_urls")] - public ManagementUrls? ManagementUrls { get; set; } - - // [JsonPropertyName("discount")] - // public object Discount { get; set; } - - // [JsonPropertyName("import_meta")] - // public object ImportMeta { get; set; } - } - - public partial class BillingCycle - { - [JsonPropertyName("frequency")] - public long Frequency { get; set; } - - [JsonPropertyName("interval")] - public string? Interval { get; set; } - } - - // public partial class CurrentBillingPeriod - // { - // [JsonPropertyName("starts_at")] - // public DateTimeOffset StartsAt { get; set; } - - // [JsonPropertyName("ends_at")] - // public DateTimeOffset EndsAt { get; set; } - // } - - // public partial class Item - // { - // [JsonPropertyName("status")] - // public string Status { get; set; } - - // [JsonPropertyName("quantity")] - // public long Quantity { get; set; } - - // [JsonPropertyName("recurring")] - // public bool Recurring { get; set; } - - // [JsonPropertyName("created_at")] - // public DateTimeOffset CreatedAt { get; set; } - - // [JsonPropertyName("updated_at")] - // public DateTimeOffset UpdatedAt { get; set; } - - // [JsonPropertyName("previously_billed_at")] - // public DateTimeOffset PreviouslyBilledAt { get; set; } - - // [JsonPropertyName("next_billed_at")] - // public DateTimeOffset NextBilledAt { get; set; } - - // [JsonPropertyName("trial_dates")] - // public object TrialDates { get; set; } - - // [JsonPropertyName("price")] - // public Price Price { get; set; } - // } - - // public partial class Price - // { - // [JsonPropertyName("id")] - // public string Id { get; set; } - - // [JsonPropertyName("product_id")] - // public string ProductId { get; set; } - - // [JsonPropertyName("type")] - // public string Type { get; set; } - - // [JsonPropertyName("description")] - // public string Description { get; set; } - - // [JsonPropertyName("name")] - // public string Name { get; set; } - - // [JsonPropertyName("tax_mode")] - // public string TaxMode { get; set; } - - // [JsonPropertyName("billing_cycle")] - // public BillingCycle BillingCycle { get; set; } - - // [JsonPropertyName("trial_period")] - // public object TrialPeriod { get; set; } - - // [JsonPropertyName("unit_price")] - // public UnitPrice UnitPrice { get; set; } - - // [JsonPropertyName("unit_price_overrides")] - // public object[] UnitPriceOverrides { get; set; } - - // [JsonPropertyName("custom_data")] - // public object CustomData { get; set; } - - // [JsonPropertyName("status")] - // public string Status { get; set; } - - // [JsonPropertyName("quantity")] - // public Quantity Quantity { get; set; } - - // [JsonPropertyName("import_meta")] - // public object ImportMeta { get; set; } - - // [JsonPropertyName("created_at")] - // public DateTimeOffset CreatedAt { get; set; } - - // [JsonPropertyName("updated_at")] - // public DateTimeOffset UpdatedAt { get; set; } - // } - - // public partial class Quantity - // { - // [JsonPropertyName("minimum")] - // public long Minimum { get; set; } - - // [JsonPropertyName("maximum")] - // public long Maximum { get; set; } - // } - - // public partial class UnitPrice - // { - // [JsonPropertyName("amount")] - // [JsonConverter(typeof(ParseStringConverter))] - // public long Amount { get; set; } - - // [JsonPropertyName("currency_code")] - // public string CurrencyCode { get; set; } - // } - - public partial class ManagementUrls - { - [JsonPropertyName("update_payment_method")] - public Uri? UpdatePaymentMethod { get; set; } - - [JsonPropertyName("cancel")] - public Uri? Cancel { get; set; } - } -} diff --git a/Streetwriters.Common/Models/GetTransactionInvoiceResponse.cs b/Streetwriters.Common/Models/GetTransactionInvoiceResponse.cs deleted file mode 100644 index 1244008..0000000 --- a/Streetwriters.Common/Models/GetTransactionInvoiceResponse.cs +++ /dev/null @@ -1,21 +0,0 @@ -namespace Streetwriters.Common.Models -{ - using System; - using System.Collections.Generic; - - using System.Text.Json; - using System.Text.Json.Serialization; - using System.Globalization; - - public class GetTransactionInvoiceResponse : PaddleResponse - { - [JsonPropertyName("data")] - public Invoice? Invoice { get; set; } - } - - public partial class Invoice - { - [JsonPropertyName("url")] - public string? Url { get; set; } - } -} diff --git a/Streetwriters.Common/Models/GetTransactionResponse.cs b/Streetwriters.Common/Models/GetTransactionResponse.cs deleted file mode 100644 index 306ce35..0000000 --- a/Streetwriters.Common/Models/GetTransactionResponse.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace Streetwriters.Common.Models -{ - using System; - using System.Collections.Generic; - - using System.Text.Json; - using System.Text.Json.Serialization; - using System.Globalization; - - public partial class GetTransactionResponse : PaddleResponse - { - [JsonPropertyName("data")] - public TransactionV2? Transaction { get; set; } - } -} diff --git a/Streetwriters.Common/Models/ListPaymentsResponse.cs b/Streetwriters.Common/Models/ListPaymentsResponse.cs deleted file mode 100644 index e27e649..0000000 --- a/Streetwriters.Common/Models/ListPaymentsResponse.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; -using System.Text.Json.Serialization; - -namespace Streetwriters.Common.Models -{ - public partial class ListPaymentsResponse - { - [JsonPropertyName("success")] - public bool Success { get; set; } - - [JsonPropertyName("response")] - public Payment[]? Payments { get; set; } - } - - public partial class Payment - { - [JsonPropertyName("id")] - public long Id { get; set; } - - [JsonPropertyName("subscription_id")] - public long SubscriptionId { get; set; } - - [JsonPropertyName("amount")] - public double Amount { get; set; } - - [JsonPropertyName("currency")] - public string? Currency { get; set; } - - [JsonPropertyName("payout_date")] - public string? PayoutDate { get; set; } - - [JsonPropertyName("is_paid")] - public short IsPaid { get; set; } - - [JsonPropertyName("is_one_off_charge")] - public bool IsOneOffCharge { get; set; } - - [JsonPropertyName("receipt_url")] - public string? ReceiptUrl { get; set; } - } -} diff --git a/Streetwriters.Common/Models/ListTransactionsResponse.cs b/Streetwriters.Common/Models/ListTransactionsResponse.cs deleted file mode 100644 index 62da3b8..0000000 --- a/Streetwriters.Common/Models/ListTransactionsResponse.cs +++ /dev/null @@ -1,77 +0,0 @@ -namespace Streetwriters.Common.Models -{ - using System; - using System.Text.Json.Serialization; - - public partial class ListTransactionsResponse - { - [JsonPropertyName("success")] - public bool Success { get; set; } - - [JsonPropertyName("response")] - public Transaction[]? Transactions { get; set; } - } - - public partial class Transaction - { - [JsonPropertyName("order_id")] - public string? OrderId { get; set; } - - [JsonPropertyName("checkout_id")] - public string? CheckoutId { get; set; } - - [JsonPropertyName("amount")] - public string? Amount { get; set; } - - [JsonPropertyName("currency")] - public string? Currency { get; set; } - - [JsonPropertyName("status")] - public string? Status { get; set; } - - [JsonPropertyName("created_at")] - public string? CreatedAt { get; set; } - - [JsonPropertyName("passthrough")] - public object? Passthrough { get; set; } - - [JsonPropertyName("product_id")] - public long ProductId { get; set; } - - [JsonPropertyName("is_subscription")] - public bool IsSubscription { get; set; } - - [JsonPropertyName("is_one_off")] - public bool IsOneOff { get; set; } - - [JsonPropertyName("subscription")] - public PaddleSubscription? Subscription { get; set; } - - [JsonPropertyName("user")] - public PaddleTransactionUser? User { get; set; } - - [JsonPropertyName("receipt_url")] - public string? ReceiptUrl { get; set; } - } - - public partial class PaddleSubscription - { - [JsonPropertyName("subscription_id")] - public long SubscriptionId { get; set; } - - [JsonPropertyName("status")] - public string? Status { get; set; } - } - - public partial class PaddleTransactionUser - { - [JsonPropertyName("user_id")] - public long UserId { get; set; } - - [JsonPropertyName("email")] - public string? Email { get; set; } - - [JsonPropertyName("marketing_consent")] - public bool MarketingConsent { get; set; } - } -} diff --git a/Streetwriters.Common/Models/ListTransactionsResponseV2.cs b/Streetwriters.Common/Models/ListTransactionsResponseV2.cs deleted file mode 100644 index 5c57e7e..0000000 --- a/Streetwriters.Common/Models/ListTransactionsResponseV2.cs +++ /dev/null @@ -1,511 +0,0 @@ -namespace Streetwriters.Common.Models -{ - using System; - using System.Collections.Generic; - - using System.Text.Json; - using System.Text.Json.Serialization; - using System.Globalization; - - public partial class ListTransactionsResponseV2 : PaddleResponse - { - [JsonPropertyName("data")] - public TransactionV2[]? Transactions { get; set; } - } - - public partial class TransactionV2 - { - [JsonPropertyName("id")] - public string? Id { get; set; } - - [JsonPropertyName("status")] - public string? Status { get; set; } - - [JsonPropertyName("customer_id")] - public string? CustomerId { get; set; } - - // [JsonPropertyName("address_id")] - // public string AddressId { get; set; } - - // [JsonPropertyName("business_id")] - // public object BusinessId { get; set; } - - [JsonPropertyName("custom_data")] - public Dictionary? CustomData { get; set; } - - [JsonPropertyName("origin")] - public string? Origin { get; set; } - - // [JsonPropertyName("collection_mode")] - // public string CollectionMode { get; set; } - - // [JsonPropertyName("subscription_id")] - // public string SubscriptionId { get; set; } - - // [JsonPropertyName("invoice_id")] - // public string InvoiceId { get; set; } - - // [JsonPropertyName("invoice_number")] - // public string InvoiceNumber { get; set; } - - [JsonPropertyName("billing_details")] - public BillingDetails? BillingDetails { get; set; } - - [JsonPropertyName("billing_period")] - public BillingPeriod? BillingPeriod { get; set; } - - // [JsonPropertyName("currency_code")] - // public string CurrencyCode { get; set; } - - // [JsonPropertyName("discount_id")] - // public string DiscountId { get; set; } - - [JsonPropertyName("created_at")] - public DateTimeOffset CreatedAt { get; set; } - - // [JsonPropertyName("updated_at")] - // public DateTimeOffset UpdatedAt { get; set; } - - [JsonPropertyName("billed_at")] - public DateTimeOffset? BilledAt { get; set; } - - [JsonPropertyName("items")] - public Item[]? Items { get; set; } - - [JsonPropertyName("details")] - public Details? Details { get; set; } - - // [JsonPropertyName("payments")] - // public Payment[] Payments { get; set; } - - // [JsonPropertyName("checkout")] - // public Checkout Checkout { get; set; } - } - - public partial class BillingDetails - { - // [JsonPropertyName("enable_checkout")] - // public bool EnableCheckout { get; set; } - - [JsonPropertyName("payment_terms")] - public PaymentTerms? PaymentTerms { get; set; } - - // [JsonPropertyName("purchase_order_number")] - // public string PurchaseOrderNumber { get; set; } - - // [JsonPropertyName("additional_information")] - // public object AdditionalInformation { get; set; } - } - - public partial class PaymentTerms - { - [JsonPropertyName("interval")] - public string? Interval { get; set; } - - [JsonPropertyName("frequency")] - public long Frequency { get; set; } - } - - public partial class BillingPeriod - { - [JsonPropertyName("starts_at")] - public DateTimeOffset StartsAt { get; set; } - - [JsonPropertyName("ends_at")] - public DateTimeOffset EndsAt { get; set; } - } - - // public partial class Checkout - // { - // [JsonPropertyName("url")] - // public Uri Url { get; set; } - // } - - public partial class Details - { - // [JsonPropertyName("tax_rates_used")] - // public TaxRatesUsed[] TaxRatesUsed { get; set; } - - [JsonPropertyName("totals")] - public Totals? Totals { get; set; } - - // [JsonPropertyName("adjusted_totals")] - // public AdjustedTotals AdjustedTotals { get; set; } - - // [JsonPropertyName("payout_totals")] - // public Dictionary PayoutTotals { get; set; } - - // [JsonPropertyName("adjusted_payout_totals")] - // public AdjustedTotals AdjustedPayoutTotals { get; set; } - - [JsonPropertyName("line_items")] - public LineItem[]? LineItems { get; set; } - } - - public partial class Totals - { - [JsonPropertyName("subtotal")] - public long Subtotal { get; set; } - - [JsonPropertyName("tax")] - public long Tax { get; set; } - - [JsonPropertyName("discount")] - public long Discount { get; set; } - - [JsonPropertyName("total")] - public long Total { get; set; } - - [JsonPropertyName("grand_total")] - public long GrandTotal { get; set; } - - // [JsonPropertyName("fee")] - // public object Fee { get; set; } - - // [JsonPropertyName("credit")] - // public long Credit { get; set; } - - // [JsonPropertyName("credit_to_balance")] - // public long CreditToBalance { get; set; } - - [JsonPropertyName("balance")] - public long Balance { get; set; } - - // [JsonPropertyName("earnings")] - // public object Earnings { get; set; } - - [JsonPropertyName("currency_code")] - public string? CurrencyCode { get; set; } - } - // public partial class AdjustedTotals - // { - // [JsonPropertyName("subtotal")] - // [JsonConverter(typeof(ParseStringConverter))] - // public long Subtotal { get; set; } - - // [JsonPropertyName("tax")] - // [JsonConverter(typeof(ParseStringConverter))] - // public long Tax { get; set; } - - // [JsonPropertyName("total")] - // [JsonConverter(typeof(ParseStringConverter))] - // public long Total { get; set; } - - // [JsonPropertyName("fee")] - // [JsonConverter(typeof(ParseStringConverter))] - // public long Fee { get; set; } - - // [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] - // [JsonPropertyName("chargeback_fee")] - // public ChargebackFee ChargebackFee { get; set; } - - // [JsonPropertyName("earnings")] - // [JsonConverter(typeof(ParseStringConverter))] - // public long Earnings { get; set; } - - // [JsonPropertyName("currency_code")] - // public string CurrencyCode { get; set; } - - // [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] - // [JsonPropertyName("grand_total")] - // [JsonConverter(typeof(ParseStringConverter))] - // public long? GrandTotal { get; set; } - // } - - // public partial class ChargebackFee - // { - // [JsonPropertyName("amount")] - // [JsonConverter(typeof(ParseStringConverter))] - // public long Amount { get; set; } - - // [JsonPropertyName("original")] - // public object Original { get; set; } - // } - - public partial class LineItem - { - [JsonPropertyName("id")] - public string? Id { get; set; } - - [JsonPropertyName("price_id")] - public string? PriceId { get; set; } - - // [JsonPropertyName("quantity")] - // public long Quantity { get; set; } - - // [JsonPropertyName("totals")] - // public Totals Totals { get; set; } - - // [JsonPropertyName("product")] - // public Product Product { get; set; } - - // [JsonPropertyName("tax_rate")] - // public string TaxRate { get; set; } - - // [JsonPropertyName("unit_totals")] - // public Totals UnitTotals { get; set; } - - [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] - [JsonPropertyName("proration")] - public Proration? Proration { get; set; } - } - - // public partial class Product - // { - // [JsonPropertyName("id")] - // public string Id { get; set; } - - // [JsonPropertyName("name")] - // public string Name { get; set; } - - // [JsonPropertyName("description")] - // public string Description { get; set; } - - // [JsonPropertyName("type")] - // public TypeEnum Type { get; set; } - - // [JsonPropertyName("tax_category")] - // public TypeEnum TaxCategory { get; set; } - - // [JsonPropertyName("image_url")] - // public Uri ImageUrl { get; set; } - - // [JsonPropertyName("custom_data")] - // public CustomData CustomData { get; set; } - - // [JsonPropertyName("status")] - // public Status Status { get; set; } - - // [JsonPropertyName("created_at")] - // public DateTimeOffset CreatedAt { get; set; } - - // [JsonPropertyName("updated_at")] - // public DateTimeOffset UpdatedAt { get; set; } - - // [JsonPropertyName("import_meta")] - // public object ImportMeta { get; set; } - // } - - // public partial class CustomData - // { - // [JsonPropertyName("features")] - // public Features Features { get; set; } - - // [JsonPropertyName("suggested_addons")] - // public string[] SuggestedAddons { get; set; } - - // [JsonPropertyName("upgrade_description")] - // public string UpgradeDescription { get; set; } - // } - - // public partial class Features - // { - // [JsonPropertyName("aircraft_performance")] - // public bool AircraftPerformance { get; set; } - - // [JsonPropertyName("compliance_monitoring")] - // public bool ComplianceMonitoring { get; set; } - - // [JsonPropertyName("flight_log_management")] - // public bool FlightLogManagement { get; set; } - - // [JsonPropertyName("payment_by_invoice")] - // public bool PaymentByInvoice { get; set; } - - // [JsonPropertyName("route_planning")] - // public bool RoutePlanning { get; set; } - - // [JsonPropertyName("sso")] - // public bool Sso { get; set; } - // } - - public partial class Proration - { - [JsonPropertyName("billing_period")] - public BillingPeriod? BillingPeriod { get; set; } - } - - // public partial class Totals - // { - // [JsonPropertyName("subtotal")] - // [JsonConverter(typeof(ParseStringConverter))] - // public long Subtotal { get; set; } - - // [JsonPropertyName("discount")] - // [JsonConverter(typeof(ParseStringConverter))] - // public long Discount { get; set; } - - // [JsonPropertyName("tax")] - // [JsonConverter(typeof(ParseStringConverter))] - // public long Tax { get; set; } - - // [JsonPropertyName("total")] - // [JsonConverter(typeof(ParseStringConverter))] - // public long Total { get; set; } - // } - - // public partial class TaxRatesUsed - // { - // [JsonPropertyName("tax_rate")] - // public string TaxRate { get; set; } - - // [JsonPropertyName("totals")] - // public Totals Totals { get; set; } - // } - - public partial class Item - { - [JsonPropertyName("price")] - public Price? Price { get; set; } - - [JsonPropertyName("quantity")] - public long Quantity { get; set; } - - [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] - [JsonPropertyName("proration")] - public Proration? Proration { get; set; } - } - - public partial class Price - { - [JsonPropertyName("id")] - public string? Id { get; set; } - - // [JsonPropertyName("description")] - // public string Description { get; set; } - - // [JsonPropertyName("type")] - // public TypeEnum Type { get; set; } - - [JsonPropertyName("name")] - public string? Name { get; set; } - - // [JsonPropertyName("product_id")] - // public string ProductId { get; set; } - - // [JsonPropertyName("billing_cycle")] - // public PaymentTerms BillingCycle { get; set; } - - // [JsonPropertyName("trial_period")] - // public object TrialPeriod { get; set; } - - // [JsonPropertyName("tax_mode")] - // public TaxMode TaxMode { get; set; } - - // [JsonPropertyName("unit_price")] - // public UnitPrice UnitPrice { get; set; } - - // [JsonPropertyName("unit_price_overrides")] - // public object[] UnitPriceOverrides { get; set; } - - // [JsonPropertyName("custom_data")] - // public object CustomData { get; set; } - - // [JsonPropertyName("quantity")] - // public Quantity Quantity { get; set; } - - // [JsonPropertyName("status")] - // public Status Status { get; set; } - - // [JsonPropertyName("created_at")] - // public DateTimeOffset CreatedAt { get; set; } - - // [JsonPropertyName("updated_at")] - // public DateTimeOffset UpdatedAt { get; set; } - - // [JsonPropertyName("import_meta")] - // public object ImportMeta { get; set; } - } - - // public partial class Quantity - // { - // [JsonPropertyName("minimum")] - // public long Minimum { get; set; } - - // [JsonPropertyName("maximum")] - // public long Maximum { get; set; } - // } - - // public partial class UnitPrice - // { - // [JsonPropertyName("amount")] - // [JsonConverter(typeof(ParseStringConverter))] - // public long Amount { get; set; } - - // [JsonPropertyName("currency_code")] - // public CurrencyCode CurrencyCode { get; set; } - // } - - // public partial class Payment - // { - // [JsonPropertyName("payment_attempt_id")] - // public Guid PaymentAttemptId { get; set; } - - // [JsonPropertyName("stored_payment_method_id")] - // public Guid StoredPaymentMethodId { get; set; } - - // [JsonPropertyName("payment_method_id")] - // public string PaymentMethodId { get; set; } - - // [JsonPropertyName("amount")] - // [JsonConverter(typeof(ParseStringConverter))] - // public long Amount { get; set; } - - // [JsonPropertyName("status")] - // public string Status { get; set; } - - // [JsonPropertyName("error_code")] - // public string ErrorCode { get; set; } - - // [JsonPropertyName("method_details")] - // public MethodDetails MethodDetails { get; set; } - - // [JsonPropertyName("created_at")] - // public DateTimeOffset CreatedAt { get; set; } - - // [JsonPropertyName("captured_at")] - // public DateTimeOffset? CapturedAt { get; set; } - // } - - // public partial class MethodDetails - // { - // [JsonPropertyName("type")] - // public string Type { get; set; } - - // [JsonPropertyName("card")] - // public Card Card { get; set; } - // } - - // public partial class Card - // { - // [JsonPropertyName("type")] - // public string Type { get; set; } - - // [JsonPropertyName("last4")] - // public string Last4 { get; set; } - - // [JsonPropertyName("expiry_month")] - // public long ExpiryMonth { get; set; } - - // [JsonPropertyName("expiry_year")] - // public long ExpiryYear { get; set; } - - // [JsonPropertyName("cardholder_name")] - // public string CardholderName { get; set; } - // } - - public partial class Pagination - { - [JsonPropertyName("per_page")] - public long PerPage { get; set; } - - [JsonPropertyName("next")] - public Uri? Next { get; set; } - - [JsonPropertyName("has_more")] - public bool HasMore { get; set; } - - [JsonPropertyName("estimated_total")] - public long EstimatedTotal { get; set; } - } -} diff --git a/Streetwriters.Common/Models/ListUsersResponse.cs b/Streetwriters.Common/Models/ListUsersResponse.cs deleted file mode 100644 index 3e71ddb..0000000 --- a/Streetwriters.Common/Models/ListUsersResponse.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System; -using System.Text.Json.Serialization; - -namespace Streetwriters.Common.Models -{ - public partial class ListUsersResponse - { - [JsonPropertyName("success")] - public bool Success { get; set; } - - [JsonPropertyName("response")] - public PaddleUser[]? Users { get; set; } - } - - public class PaddleUser - { - [JsonPropertyName("subscription_id")] - public long SubscriptionId { get; set; } - - [JsonPropertyName("plan_id")] - public long PlanId { get; set; } - - [JsonPropertyName("user_id")] - public long UserId { get; set; } - - [JsonPropertyName("user_email")] - public string? UserEmail { get; set; } - - [JsonPropertyName("marketing_consent")] - public bool MarketingConsent { get; set; } - - [JsonPropertyName("update_url")] - public string? UpdateUrl { get; set; } - - [JsonPropertyName("cancel_url")] - public string? CancelUrl { get; set; } - - [JsonPropertyName("state")] - public string? State { get; set; } - - [JsonPropertyName("signup_date")] - public string? SignupDate { get; set; } - - [JsonPropertyName("quantity")] - public long Quantity { get; set; } - } -} diff --git a/Streetwriters.Common/Models/PaddleResponse.cs b/Streetwriters.Common/Models/PaddleResponse.cs deleted file mode 100644 index 68bd396..0000000 --- a/Streetwriters.Common/Models/PaddleResponse.cs +++ /dev/null @@ -1,24 +0,0 @@ -namespace Streetwriters.Common.Models -{ - using System; - using System.Collections.Generic; - - using System.Text.Json; - using System.Text.Json.Serialization; - using System.Globalization; - - public partial class PaddleResponse - { - [JsonPropertyName("error")] - public PaddleError? Error { get; set; } - } - - public class PaddleError - { - public string? Type { get; set; } - public string? Code { get; set; } - public string? Detail { get; set; } - [JsonPropertyName("documentation_url")] - public string? DocumentationUrl { get; set; } - } -} \ No newline at end of file diff --git a/Streetwriters.Common/Models/RefundPaymentResponse.cs b/Streetwriters.Common/Models/RefundPaymentResponse.cs deleted file mode 100644 index 7d8ba42..0000000 --- a/Streetwriters.Common/Models/RefundPaymentResponse.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using System.Text.Json.Serialization; - -namespace Streetwriters.Common.Models -{ - public partial class RefundPaymentResponse - { - [JsonPropertyName("success")] - public bool Success { get; set; } - - [JsonPropertyName("response")] - public required Refund Refund { get; set; } - } - - public partial class Refund - { - [JsonPropertyName("refund_request_id")] - public long RefundRequestId { get; set; } - } -} diff --git a/Streetwriters.Common/Models/SubscriptionPreviewResponse.cs b/Streetwriters.Common/Models/SubscriptionPreviewResponse.cs deleted file mode 100644 index 2724cd2..0000000 --- a/Streetwriters.Common/Models/SubscriptionPreviewResponse.cs +++ /dev/null @@ -1,57 +0,0 @@ -namespace Streetwriters.Common.Models -{ - using System; - using System.Collections.Generic; - - using System.Text.Json; - using System.Text.Json.Serialization; - using System.Globalization; - - public partial class SubscriptionPreviewResponse : PaddleResponse - { - [JsonPropertyName("data")] - public SubscriptionPreviewData? Data { get; set; } - } - - public partial class SubscriptionPreviewData - { - [JsonPropertyName("currency_code")] - public string? CurrencyCode { get; set; } - - [JsonPropertyName("billing_cycle")] - public BillingCycle? BillingCycle { get; set; } - - [JsonPropertyName("update_summary")] - public UpdateSummary? UpdateSummary { get; set; } - - [JsonPropertyName("immediate_transaction")] - public TransactionV2? ImmediateTransaction { get; set; } - - [JsonPropertyName("next_transaction")] - public TransactionV2? NextTransaction { get; set; } - - [JsonPropertyName("recurring_transaction_details")] - public Details? RecurringTransactionDetails { get; set; } - } - - public partial class UpdateSummary - { - [JsonPropertyName("charge")] - public UpdateSummaryItem? Charge { get; set; } - - [JsonPropertyName("credit")] - public UpdateSummaryItem? Credit { get; set; } - - [JsonPropertyName("result")] - public UpdateSummaryItem? Result { get; set; } - } - - public partial class UpdateSummaryItem - { - [JsonPropertyName("amount")] - public long Amount { get; set; } - - [JsonPropertyName("action")] - public string? Action { get; set; } - } -} diff --git a/Streetwriters.Common/Services/PaddleBillingService.cs b/Streetwriters.Common/Services/PaddleBillingService.cs deleted file mode 100644 index fddb6ab..0000000 --- a/Streetwriters.Common/Services/PaddleBillingService.cs +++ /dev/null @@ -1,138 +0,0 @@ -using System.Collections.Generic; -using System.Net.Http; -using System.Net.Http.Headers; -using System.Net.Http.Json; -using System.Threading.Tasks; -using Microsoft.AspNetCore.WebUtilities; -using Streetwriters.Common.Models; - -namespace Streetwriters.Common.Services -{ - public class PaddleBillingService - { -#if DEBUG - private const string PADDLE_BASE_URI = "https://sandbox-api.paddle.com"; -#else - private const string PADDLE_BASE_URI = "https://api.paddle.com"; -#endif - private readonly HttpClient httpClient = new(); - public PaddleBillingService(string paddleApiKey) - { - httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", paddleApiKey); - } - - public async Task GetSubscriptionAsync(string subscriptionId) - { - var url = $"{PADDLE_BASE_URI}/subscriptions/{subscriptionId}"; - var response = await httpClient.GetAsync(url); - return await response.Content.ReadFromJsonAsync(); - } - - public async Task GetTransactionAsync(string transactionId) - { - var url = $"{PADDLE_BASE_URI}/transactions/{transactionId}"; - var response = await httpClient.GetAsync(url); - return await response.Content.ReadFromJsonAsync(); - } - - public async Task GetTransactionInvoiceAsync(string transactionId) - { - var url = $"{PADDLE_BASE_URI}/transactions/{transactionId}/invoice"; - var response = await httpClient.GetAsync(url); - return await response.Content.ReadFromJsonAsync(); - } - - public async Task ListTransactionsAsync(string? subscriptionId = null, string? customerId = null, string[]? status = null, string[]? origin = null) - { - var url = $"{PADDLE_BASE_URI}/transactions"; - var parameters = new Dictionary() - { - { "subscription_id", subscriptionId }, - { "customer_id", customerId }, - { "status", string.Join(',', status ?? ["billed","completed"]) }, - { "order_by", "billed_at[DESC]" } - }; - if (origin is not null) parameters.Add("origin", string.Join(',', origin)); - var response = await httpClient.GetAsync(QueryHelpers.AddQueryString(url, parameters)); - - return await response.Content.ReadFromJsonAsync(); - } - - public async Task RefundTransactionAsync(string transactionId, string transactionItemId, string reason = "") - { - var url = $"{PADDLE_BASE_URI}/adjustments"; - var response = await httpClient.PostAsync(url, JsonContent.Create(new Dictionary - { - { "action", "refund" }, - { - "items", - new object[] - { - new Dictionary { - {"item_id", transactionItemId}, - {"type", "full"} - } - } - }, - { "reason", reason }, - { "transaction_id", transactionId } - })); - return await response.Content.ReadFromJsonAsync(); - } - - public async Task PreviewSubscriptionChangeAsync(string subscriptionId, string newProductId, bool isTrialing) - { - var url = $"{PADDLE_BASE_URI}/subscriptions/{subscriptionId}/preview"; - var response = await httpClient.PatchAsync(url, JsonContent.Create(new - { - proration_billing_mode = isTrialing ? "do_not_bill" : "prorated_immediately", - items = new[] { new { price_id = newProductId, quantity = 1 } } - })); - return await response.Content.ReadFromJsonAsync(); - } - - public async Task ChangeSubscriptionAsync(string subscriptionId, string newProductId, bool isTrialing) - { - var url = $"{PADDLE_BASE_URI}/subscriptions/{subscriptionId}"; - var response = await httpClient.PatchAsync(url, JsonContent.Create(new - { - proration_billing_mode = isTrialing ? "do_not_bill" : "prorated_immediately", - items = new[] { new { price_id = newProductId, quantity = 1 } } - })); - return await response.Content.ReadFromJsonAsync(); - } - - public async Task CancelSubscriptionAsync(string subscriptionId) - { - var url = $"{PADDLE_BASE_URI}/subscriptions/{subscriptionId}/cancel"; - var response = await httpClient.PostAsync(url, JsonContent.Create(new { effective_from = "immediately" })); - return await response.Content.ReadFromJsonAsync(); - } - - public async Task PauseSubscriptionAsync(string subscriptionId) - { - var url = $"{PADDLE_BASE_URI}/subscriptions/{subscriptionId}/pause"; - var response = await httpClient.PostAsync(url, JsonContent.Create(new { })); - return await response.Content.ReadFromJsonAsync(); - } - - public async Task ResumeSubscriptionAsync(string subscriptionId) - { - var url = $"{PADDLE_BASE_URI}/subscriptions/{subscriptionId}"; - var response = await httpClient.PatchAsync(url, JsonContent.Create(new Dictionary - { - {"scheduled_change", null} - })); - return await response.Content.ReadFromJsonAsync(); - } - - public async Task FindCustomerFromTransactionAsync(string transactionId) - { - var transaction = await GetTransactionAsync(transactionId); - if (transaction?.Transaction?.CustomerId == null) return null; - var url = $"{PADDLE_BASE_URI}/customers/{transaction.Transaction.CustomerId}"; - var response = await httpClient.GetFromJsonAsync(url); - return response; - } - } -} \ No newline at end of file diff --git a/Streetwriters.Common/Services/PaddleService.cs b/Streetwriters.Common/Services/PaddleService.cs deleted file mode 100644 index 0a25938..0000000 --- a/Streetwriters.Common/Services/PaddleService.cs +++ /dev/null @@ -1,188 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Net.Http; -using System.Net.Http.Json; -using System.Text.Json.Serialization; -using System.Threading.Tasks; -using Streetwriters.Common.Models; - -namespace Streetwriters.Common.Services -{ - public class PaddleService(string vendorId, string vendorAuthCode) - { -#if (DEBUG || STAGING) - const string PADDLE_BASE_URI = "https://sandbox-vendors.paddle.com/api"; -#else - const string PADDLE_BASE_URI = "https://vendors.paddle.com/api"; -#endif - - HttpClient httpClient = new HttpClient(); - - public async Task ListUsersAsync( - string subscriptionId, - int results - ) - { - var url = $"{PADDLE_BASE_URI}/2.0/subscription/users"; - var httpClient = new HttpClient(); - var response = await httpClient.PostAsync( - url, - new FormUrlEncodedContent( - new Dictionary - { - { "vendor_id", vendorId }, - { "vendor_auth_code", vendorAuthCode }, - { "subscription_id", subscriptionId }, - { "results_per_page", results.ToString() }, - } - ) - ); - - return await response.Content.ReadFromJsonAsync(); - } - - public async Task ListPaymentsAsync( - string subscriptionId, - long planId - ) - { - var url = $"{PADDLE_BASE_URI}/2.0/subscription/payments"; - var httpClient = new HttpClient(); - var response = await httpClient.PostAsync( - url, - new FormUrlEncodedContent( - new Dictionary - { - { "vendor_id", vendorId }, - { "vendor_auth_code", vendorAuthCode }, - { "subscription_id", subscriptionId }, - { "is_paid", "1" }, - { "plan", planId.ToString() }, - { "is_one_off_charge", "0" }, - } - ) - ); - - return await response.Content.ReadFromJsonAsync(); - } - - public async Task ListTransactionsAsync( - string subscriptionId - ) - { - var url = $"{PADDLE_BASE_URI}/2.0/subscription/{subscriptionId}/transactions"; - var httpClient = new HttpClient(); - var response = await httpClient.PostAsync( - url, - new FormUrlEncodedContent( - new Dictionary - { - { "vendor_id", vendorId }, - { "vendor_auth_code", vendorAuthCode }, - } - ) - ); - - return await response.Content.ReadFromJsonAsync(); - } - - public async Task FindUserFromOrderAsync(string orderId) - { - var url = $"{PADDLE_BASE_URI}/2.0/order/{orderId}/transactions"; - var httpClient = new HttpClient(); - var response = await httpClient.PostAsync( - url, - new FormUrlEncodedContent( - new Dictionary - { - { "vendor_id", vendorId }, - { "vendor_auth_code", vendorAuthCode }, - } - ) - ); - var transactions = await response.Content.ReadFromJsonAsync(); - if (transactions?.Transactions == null || transactions.Transactions.Length == 0) return null; - return transactions.Transactions[0].User; - } - - public async Task RefundPaymentAsync(string paymentId, string reason = "") - { - var url = $"{PADDLE_BASE_URI}/2.0/payment/refund"; - var httpClient = new HttpClient(); - var response = await httpClient.PostAsync( - url, - new FormUrlEncodedContent( - new Dictionary - { - { "vendor_id", vendorId }, - { "vendor_auth_code", vendorAuthCode }, - { "order_id", paymentId }, - { "reason", reason }, - } - ) - ); - - var refundResponse = await response.Content.ReadFromJsonAsync(); - return refundResponse?.Success ?? false; - } - - public async Task CancelSubscriptionAsync(string subscriptionId) - { - var url = $"{PADDLE_BASE_URI}/2.0/subscription/users_cancel"; - var httpClient = new HttpClient(); - var response = await httpClient.PostAsync( - url, - new FormUrlEncodedContent( - new Dictionary - { - { "vendor_id", vendorId }, - { "vendor_auth_code", vendorAuthCode }, - { "subscription_id", subscriptionId }, - } - ) - ); - - return response.IsSuccessStatusCode; - } - - public async Task PauseSubscriptionAsync(string subscriptionId) - { - var url = $"{PADDLE_BASE_URI}/2.0/subscription/users/update"; - var httpClient = new HttpClient(); - var response = await httpClient.PostAsync( - url, - new FormUrlEncodedContent( - new Dictionary - { - { "vendor_id", vendorId }, - { "vendor_auth_code", vendorAuthCode }, - { "subscription_id", subscriptionId }, - { "pause", "true" }, - } - ) - ); - - return response.IsSuccessStatusCode; - } - - public async Task ResumeSubscriptionAsync(string subscriptionId) - { - var url = $"{PADDLE_BASE_URI}/2.0/subscription/users/update"; - var httpClient = new HttpClient(); - var response = await httpClient.PostAsync( - url, - new FormUrlEncodedContent( - new Dictionary - { - { "vendor_id", vendorId }, - { "vendor_auth_code", vendorAuthCode }, - { "subscription_id", subscriptionId }, - { "pause", "false" }, - } - ) - ); - - return response.IsSuccessStatusCode; - } - } -}