From 6042eb59e6f188ac7f3c1bf2d1c29f5ab0dc13b6 Mon Sep 17 00:00:00 2001 From: Ricardo Carneiro Date: Sun, 31 Aug 2025 22:28:20 -0300 Subject: [PATCH] fix: log com delay temporario para logar pagamento --- BCards.sln | 5 + Conexoes.txt | 4 + .../Controllers/StripeWebhookController.cs | 194 +++++++++++------- src/BCards.Web/Program.cs | 2 - 4 files changed, 132 insertions(+), 73 deletions(-) create mode 100644 Conexoes.txt diff --git a/BCards.sln b/BCards.sln index 7fd3afe..14841e2 100644 --- a/BCards.sln +++ b/BCards.sln @@ -18,6 +18,11 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Pipeline", "Pipeline", "{3F .gitea\workflows\deploy-bcards.yml = .gitea\workflows\deploy-bcards.yml EndProjectSection EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{8EC462FD-D22E-90A8-E5CE-7E832BA40C5D}" + ProjectSection(SolutionItems) = preProject + Conexoes.txt = Conexoes.txt + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU diff --git a/Conexoes.txt b/Conexoes.txt new file mode 100644 index 0000000..5af174f --- /dev/null +++ b/Conexoes.txt @@ -0,0 +1,4 @@ +bcards +ssh ubuntu@141.148.162.114 +convert-it +ssh ubuntu@129.146.116.218 diff --git a/src/BCards.Web/Controllers/StripeWebhookController.cs b/src/BCards.Web/Controllers/StripeWebhookController.cs index 4464e8a..24addff 100644 --- a/src/BCards.Web/Controllers/StripeWebhookController.cs +++ b/src/BCards.Web/Controllers/StripeWebhookController.cs @@ -50,6 +50,7 @@ public class StripeWebhookController : ControllerBase return BadRequest("Missing Stripe signature"); } + _logger.LogInformation($"Contruir evento Stripe: {json}"); var stripeEvent = EventUtility.ConstructEvent( json, stripeSignature, @@ -82,15 +83,18 @@ public class StripeWebhookController : ControllerBase break; } + await Task.Delay(2000); // 2 segundos return Ok(); } catch (StripeException ex) { + await Task.Delay(2000); // 2 segundos _logger.LogError(ex, "Stripe webhook error"); return BadRequest($"Stripe error: {ex.Message}"); } catch (Exception ex) { + await Task.Delay(2000); // 2 segundos _logger.LogError(ex, "Webhook processing error"); return StatusCode(500, "Internal server error"); } @@ -98,116 +102,164 @@ public class StripeWebhookController : ControllerBase private async Task HandlePaymentSucceeded(Event stripeEvent) { - if (stripeEvent.Data.Object is Invoice invoice) + try { - _logger.LogInformation($"Payment succeeded for customer: {invoice.CustomerId}"); - - var subscriptionId = GetSubscriptionId(stripeEvent); - var subscription = await _subscriptionRepository.GetByStripeSubscriptionIdAsync(subscriptionId); - if (subscription != null) + if (stripeEvent.Data.Object is Invoice invoice) { - subscription.Status = "active"; - subscription.UpdatedAt = DateTime.UtcNow; - await _subscriptionRepository.UpdateAsync(subscription); + _logger.LogInformation($"Payment succeeded for customer: {invoice.CustomerId}"); - // Reactivate user pages - var userPages = await _userPageService.GetUserPagesAsync(subscription.UserId); - foreach (var page in userPages.Where(p => p.Status == ViewModels.PageStatus.PendingPayment)) + var subscriptionId = GetSubscriptionId(stripeEvent); + var subscription = await _subscriptionRepository.GetByStripeSubscriptionIdAsync(subscriptionId); + if (subscription != null) { - page.Status = ViewModels.PageStatus.Active; - page.UpdatedAt = DateTime.UtcNow; - await _userPageService.UpdatePageAsync(page); - } + subscription.Status = "active"; + subscription.UpdatedAt = DateTime.UtcNow; + await _subscriptionRepository.UpdateAsync(subscription); - _logger.LogInformation($"Reactivated {userPages.Count} pages for user {subscription.UserId}"); + // Reactivate user pages + var userPages = await _userPageService.GetUserPagesAsync(subscription.UserId); + foreach (var page in userPages.Where(p => p.Status == ViewModels.PageStatus.PendingPayment)) + { + page.Status = ViewModels.PageStatus.Active; + page.UpdatedAt = DateTime.UtcNow; + await _userPageService.UpdatePageAsync(page); + } + + _logger.LogInformation($"Reactivated {userPages.Count} pages for user {subscription.UserId}"); + } } + else + { + _logger.LogWarning($"Unexpected event type on HandlePaymentSucceeded: {stripeEvent.Type}"); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "Error handling payment succeeded event"); + throw new Exception("Error handling payment succeeded event", ex); } } private async Task HandlePaymentFailed(Event stripeEvent) { - if (stripeEvent.Data.Object is Invoice invoice) + try { - _logger.LogInformation($"Payment failed for customer: {invoice.CustomerId}"); - - var subscriptionId = GetSubscriptionId(stripeEvent); - var subscription = await _subscriptionRepository.GetByStripeSubscriptionIdAsync(subscriptionId); - if (subscription != null) + if (stripeEvent.Data.Object is Invoice invoice) { - subscription.Status = "past_due"; - subscription.UpdatedAt = DateTime.UtcNow; - await _subscriptionRepository.UpdateAsync(subscription); + _logger.LogInformation($"Payment failed for customer: {invoice.CustomerId}"); - // Set pages to pending payment - var userPages = await _userPageService.GetUserPagesAsync(subscription.UserId); - foreach (var page in userPages.Where(p => p.Status == ViewModels.PageStatus.Active)) + var subscriptionId = GetSubscriptionId(stripeEvent); + var subscription = await _subscriptionRepository.GetByStripeSubscriptionIdAsync(subscriptionId); + if (subscription != null) { - page.Status = ViewModels.PageStatus.PendingPayment; - page.UpdatedAt = DateTime.UtcNow; - await _userPageService.UpdatePageAsync(page); - } + subscription.Status = "past_due"; + subscription.UpdatedAt = DateTime.UtcNow; + await _subscriptionRepository.UpdateAsync(subscription); - _logger.LogInformation($"Set {userPages.Count} pages to pending payment for user {subscription.UserId}"); + // Set pages to pending payment + var userPages = await _userPageService.GetUserPagesAsync(subscription.UserId); + foreach (var page in userPages.Where(p => p.Status == ViewModels.PageStatus.Active)) + { + page.Status = ViewModels.PageStatus.PendingPayment; + page.UpdatedAt = DateTime.UtcNow; + await _userPageService.UpdatePageAsync(page); + } + + _logger.LogInformation($"Set {userPages.Count} pages to pending payment for user {subscription.UserId}"); + } } + else + { + _logger.LogWarning($"Unexpected event type on HandlePaymentFailed: {stripeEvent.Type}"); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "Error handling payment failed event"); + throw new Exception("Error handling payment failed event", ex); } } private async Task HandleSubscriptionDeleted(Event stripeEvent) { - if (stripeEvent.Data.Object is Subscription stripeSubscription) + try { - _logger.LogInformation($"Subscription cancelled: {stripeSubscription.Id}"); - - var subscription = await _subscriptionRepository.GetByStripeSubscriptionIdAsync(stripeSubscription.Id); - if (subscription != null) + if (stripeEvent.Data.Object is Subscription stripeSubscription) { - subscription.Status = "cancelled"; - subscription.UpdatedAt = DateTime.UtcNow; - await _subscriptionRepository.UpdateAsync(subscription); + _logger.LogInformation($"Subscription cancelled: {stripeSubscription.Id}"); - // Downgrade to trial or deactivate pages - var userPages = await _userPageService.GetUserPagesAsync(subscription.UserId); - foreach (var page in userPages.Where(p => p.Status == ViewModels.PageStatus.Active)) + var subscription = await _subscriptionRepository.GetByStripeSubscriptionIdAsync(stripeSubscription.Id); + if (subscription != null) { - page.Status = ViewModels.PageStatus.Expired; - page.UpdatedAt = DateTime.UtcNow; - await _userPageService.UpdatePageAsync(page); - } + subscription.Status = "cancelled"; + subscription.UpdatedAt = DateTime.UtcNow; + await _subscriptionRepository.UpdateAsync(subscription); - _logger.LogInformation($"Deactivated {userPages.Count} pages for cancelled subscription {subscription.UserId}"); + // Downgrade to trial or deactivate pages + var userPages = await _userPageService.GetUserPagesAsync(subscription.UserId); + foreach (var page in userPages.Where(p => p.Status == ViewModels.PageStatus.Active)) + { + page.Status = ViewModels.PageStatus.Expired; + page.UpdatedAt = DateTime.UtcNow; + await _userPageService.UpdatePageAsync(page); + } + + _logger.LogInformation($"Deactivated {userPages.Count} pages for cancelled subscription {subscription.UserId}"); + } } + else + { + _logger.LogWarning($"Unexpected event type on HandlePaymentFailed: {stripeEvent.Type}"); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "Error handling subscription deleted failed event"); + throw new Exception("Error handling subscription deleted failed event", ex); } } private async Task HandleSubscriptionUpdated(Event stripeEvent) { - if (stripeEvent.Data.Object is Subscription stripeSubscription) + try { - _logger.LogInformation($"Subscription updated: {stripeSubscription.Id}"); - - var subscription = await _subscriptionRepository.GetByStripeSubscriptionIdAsync(stripeSubscription.Id); - if (subscription != null) + if (stripeEvent.Data.Object is Subscription stripeSubscription) { - var service = new SubscriptionItemService(); - var subItem = service.Get(stripeSubscription.Items.Data[0].Id); + _logger.LogInformation($"Subscription updated: {stripeSubscription.Id}"); - subscription.Status = stripeSubscription.Status; - subscription.CurrentPeriodStart = subItem.CurrentPeriodStart; - subscription.CurrentPeriodEnd = subItem.CurrentPeriodEnd; - subscription.CancelAtPeriodEnd = stripeSubscription.CancelAtPeriodEnd; - subscription.UpdatedAt = DateTime.UtcNow; - - // Update plan type based on Stripe price ID - var priceId = stripeSubscription.Items.Data.FirstOrDefault()?.Price.Id; - if (!string.IsNullOrEmpty(priceId)) + var subscription = await _subscriptionRepository.GetByStripeSubscriptionIdAsync(stripeSubscription.Id); + if (subscription != null) { - subscription.PlanType = MapPriceIdToPlanType(priceId); + var service = new SubscriptionItemService(); + var subItem = service.Get(stripeSubscription.Items.Data[0].Id); + + subscription.Status = stripeSubscription.Status; + subscription.CurrentPeriodStart = subItem.CurrentPeriodStart; + subscription.CurrentPeriodEnd = subItem.CurrentPeriodEnd; + subscription.CancelAtPeriodEnd = stripeSubscription.CancelAtPeriodEnd; + subscription.UpdatedAt = DateTime.UtcNow; + + // Update plan type based on Stripe price ID + var priceId = stripeSubscription.Items.Data.FirstOrDefault()?.Price.Id; + if (!string.IsNullOrEmpty(priceId)) + { + subscription.PlanType = MapPriceIdToPlanType(priceId); + } + + await _subscriptionRepository.UpdateAsync(subscription); + + _logger.LogInformation($"Updated subscription for user {subscription.UserId}"); } - - await _subscriptionRepository.UpdateAsync(subscription); - - _logger.LogInformation($"Updated subscription for user {subscription.UserId}"); } + else + { + _logger.LogWarning($"Unexpected event type on HandlePaymentFailed: {stripeEvent.Type}"); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "Error handling subscription updated failed event"); + throw new Exception("Error handling subscription updated failed event", ex); } } diff --git a/src/BCards.Web/Program.cs b/src/BCards.Web/Program.cs index cea0c52..7568ed5 100644 --- a/src/BCards.Web/Program.cs +++ b/src/BCards.Web/Program.cs @@ -45,7 +45,6 @@ if (isDevelopment) .WriteTo.Async(a => a.Console( outputTemplate: "[{Timestamp:HH:mm:ss} {Level:u3}] [{Hostname}] {Message:lj} {Properties:j}{NewLine}{Exception}")); - // Also send to Seq if configured (for local development with Seq) var seqUrl = builder.Configuration["Serilog:SeqUrl"]; if (!string.IsNullOrEmpty(seqUrl)) { @@ -64,7 +63,6 @@ else restrictedToMinimumLevel: LogEventLevel.Error, outputTemplate: "[{Timestamp:yyyy-MM-dd HH:mm:ss} {Level:u3}] [{Hostname}] {Message:lj}{NewLine}{Exception}")); - // Production: Send detailed logs to Seq var seqUrl = builder.Configuration["Serilog:SeqUrl"]; if (!string.IsNullOrEmpty(seqUrl)) {