using Bit.Core.AdminConsole.Models.Data.Organizations; using Bit.Core.AdminConsole.OrganizationFeatures.Organizations.Interfaces; using Bit.Core.Billing.Services; using Bit.Core.Repositories; using Microsoft.Extensions.Logging; namespace Bit.Core.AdminConsole.OrganizationFeatures.Organizations; public class UpdateOrganizationSubscriptionCommand(IStripePaymentService paymentService, IOrganizationRepository repository, TimeProvider timeProvider, ILogger logger) : IUpdateOrganizationSubscriptionCommand { public async Task UpdateOrganizationSubscriptionAsync(IEnumerable subscriptionsToUpdate) { var successfulSyncs = new List(); foreach (var subscriptionUpdate in subscriptionsToUpdate) { try { await paymentService.AdjustSeatsAsync(subscriptionUpdate.Organization, subscriptionUpdate.Plan, subscriptionUpdate.Seats); successfulSyncs.Add(subscriptionUpdate.Organization.Id); } catch (Exception ex) { logger.LogError(ex, "Failed to update organization {organizationId} subscription.", subscriptionUpdate.Organization.Id); } } if (successfulSyncs.Count == 0) { return; } await repository.UpdateSuccessfulOrganizationSyncStatusAsync(successfulSyncs, timeProvider.GetUtcNow().UtcDateTime); } }