diff --git a/Streetwriters.Common/Models/GetCustomerResponse.cs b/Streetwriters.Common/Models/GetCustomerResponse.cs new file mode 100644 index 0000000..59203e4 --- /dev/null +++ b/Streetwriters.Common/Models/GetCustomerResponse.cs @@ -0,0 +1,21 @@ +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 index c718e1e..c431915 100644 --- a/Streetwriters.Common/Models/GetSubscriptionResponse.cs +++ b/Streetwriters.Common/Models/GetSubscriptionResponse.cs @@ -7,13 +7,10 @@ namespace Streetwriters.Common.Models using System.Text.Json.Serialization; using System.Globalization; - public partial class GetSubscriptionResponse + public partial class GetSubscriptionResponse : PaddleResponse { [JsonPropertyName("data")] public Data Data { get; set; } - - [JsonPropertyName("meta")] - public Meta Meta { get; set; } } public partial class Data @@ -214,10 +211,4 @@ namespace Streetwriters.Common.Models [JsonPropertyName("cancel")] public Uri Cancel { get; set; } } - - public partial class Meta - { - [JsonPropertyName("request_id")] - public string RequestId { get; set; } - } } diff --git a/Streetwriters.Common/Models/GetTransactionInvoiceResponse.cs b/Streetwriters.Common/Models/GetTransactionInvoiceResponse.cs index c745319..9edd9d4 100644 --- a/Streetwriters.Common/Models/GetTransactionInvoiceResponse.cs +++ b/Streetwriters.Common/Models/GetTransactionInvoiceResponse.cs @@ -7,18 +7,14 @@ namespace Streetwriters.Common.Models using System.Text.Json.Serialization; using System.Globalization; - public partial class GetTransactionInvoiceResponse + public class GetTransactionInvoiceResponse : PaddleResponse { [JsonPropertyName("data")] public Invoice Invoice { get; set; } - - [JsonPropertyName("meta")] - public Meta Meta { 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 index c293dcf..5ef8102 100644 --- a/Streetwriters.Common/Models/GetTransactionResponse.cs +++ b/Streetwriters.Common/Models/GetTransactionResponse.cs @@ -7,12 +7,9 @@ namespace Streetwriters.Common.Models using System.Text.Json.Serialization; using System.Globalization; - public partial class GetTransactionResponse + public partial class GetTransactionResponse : PaddleResponse { [JsonPropertyName("data")] public TransactionV2 Transaction { get; set; } - - [JsonPropertyName("meta")] - public Meta Meta { get; set; } } } diff --git a/Streetwriters.Common/Models/ListTransactionsResponseV2.cs b/Streetwriters.Common/Models/ListTransactionsResponseV2.cs index f0da768..647ccd0 100644 --- a/Streetwriters.Common/Models/ListTransactionsResponseV2.cs +++ b/Streetwriters.Common/Models/ListTransactionsResponseV2.cs @@ -7,13 +7,10 @@ namespace Streetwriters.Common.Models using System.Text.Json.Serialization; using System.Globalization; - public partial class ListTransactionsResponseV2 + public partial class ListTransactionsResponseV2 : PaddleResponse { [JsonPropertyName("data")] public TransactionV2[] Transactions { get; set; } - - [JsonPropertyName("meta")] - public Meta Meta { get; set; } } public partial class TransactionV2 @@ -497,12 +494,6 @@ namespace Streetwriters.Common.Models // public string CardholderName { get; set; } // } - public partial class Meta - { - [JsonPropertyName("pagination")] - public Pagination Pagination { get; set; } - } - public partial class Pagination { [JsonPropertyName("per_page")] diff --git a/Streetwriters.Common/Models/PaddleResponse.cs b/Streetwriters.Common/Models/PaddleResponse.cs new file mode 100644 index 0000000..5ccb625 --- /dev/null +++ b/Streetwriters.Common/Models/PaddleResponse.cs @@ -0,0 +1,24 @@ +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/SubscriptionPreviewResponse.cs b/Streetwriters.Common/Models/SubscriptionPreviewResponse.cs index 444d82d..7d57c99 100644 --- a/Streetwriters.Common/Models/SubscriptionPreviewResponse.cs +++ b/Streetwriters.Common/Models/SubscriptionPreviewResponse.cs @@ -7,13 +7,10 @@ namespace Streetwriters.Common.Models using System.Text.Json.Serialization; using System.Globalization; - public partial class SubscriptionPreviewResponse + public partial class SubscriptionPreviewResponse : PaddleResponse { [JsonPropertyName("data")] public SubscriptionPreviewData Data { get; set; } - - [JsonPropertyName("meta")] - public Meta Meta { get; set; } } public partial class SubscriptionPreviewData diff --git a/Streetwriters.Common/Services/PaddleBillingService.cs b/Streetwriters.Common/Services/PaddleBillingService.cs index 06e559e..a536359 100644 --- a/Streetwriters.Common/Services/PaddleBillingService.cs +++ b/Streetwriters.Common/Services/PaddleBillingService.cs @@ -80,26 +80,26 @@ namespace Streetwriters.Common.Services return response.IsSuccessStatusCode; } - public async Task PreviewSubscriptionChangeAsync(string subscriptionId, string newProductId) + 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 = "prorated_immediately", + 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) + 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 = "prorated_immediately", + proration_billing_mode = isTrialing ? "do_not_bill" : "prorated_immediately", items = new[] { new { price_id = newProductId, quantity = 1 } } })); - return response.IsSuccessStatusCode; + return await response.Content.ReadFromJsonAsync(); } public async Task CancelSubscriptionAsync(string subscriptionId) @@ -125,5 +125,14 @@ namespace Streetwriters.Common.Services })); return response.IsSuccessStatusCode; } + + public async Task FindCustomerFromTransactionAsync(string transactionId) + { + var transaction = await GetTransactionAsync(transactionId); + if (transaction == 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