private void CreateData() { foreach (Organization organization in OrganizationData.GenerateSampleOrganizations()) { if (organization.Id == TestConstants.OrganizationId3) { _billingManager.ApplyBillingPlan(organization, BillingManager.FreePlan, UserData.GenerateSampleUser()); } else { _billingManager.ApplyBillingPlan(organization, BillingManager.SmallPlan, UserData.GenerateSampleUser()); } _organizationRepository.Add(organization); } foreach (Project project in ProjectData.GenerateSampleProjects()) { var organization = _organizationRepository.GetById(project.OrganizationId); organization.ProjectCount += 1; _organizationRepository.Save(organization); _projectRepository.Add(project); } }
private void CreateData() { foreach (Organization organization in OrganizationData.GenerateSampleOrganizations()) { if (organization.Id == TestConstants.OrganizationId3) { _billingManager.ApplyBillingPlan(organization, BillingManager.FreePlan, UserData.GenerateSampleUser()); } else { _billingManager.ApplyBillingPlan(organization, BillingManager.SmallPlan, UserData.GenerateSampleUser()); } organization.StripeCustomerId = Guid.NewGuid().ToString("N"); organization.CardLast4 = "1234"; organization.SubscribeDate = DateTime.Now; if (organization.IsSuspended) { organization.SuspendedByUserId = TestConstants.UserId; organization.SuspensionCode = SuspensionCode.Billing; organization.SuspensionDate = DateTime.Now; } _organizationRepository.Add(organization); } foreach (Project project in ProjectData.GenerateSampleProjects()) { var organization = _organizationRepository.GetById(project.OrganizationId); _organizationRepository.Save(organization); _projectRepository.Add(project); } foreach (User user in UserData.GenerateSampleUsers()) { if (user.Id == TestConstants.UserId) { user.OrganizationIds.Add(TestConstants.OrganizationId2); user.OrganizationIds.Add(TestConstants.OrganizationId3); } if (!user.IsEmailAddressVerified) { user.VerifyEmailAddressToken = Guid.NewGuid().ToString(); user.VerifyEmailAddressTokenExpiration = DateTime.Now.AddDays(1); } _userRepository.Add(user); } }
public async Task CreateOrganizationAndProjectAsync(User user) { if (await _tokenRepository.ExistsAsync(TEST_API_KEY).AnyContext()) { return; } var organization = new Organization { Id = TEST_ORG_ID, Name = "Acme" }; _billingManager.ApplyBillingPlan(organization, _billingPlans.UnlimitedPlan, user); organization = await _organizationRepository.AddAsync(organization, o => o.ImmediateConsistency().Cache()).AnyContext(); var project = new Project { Id = TEST_PROJECT_ID, Name = "Disintegrating Pistol", OrganizationId = organization.Id, NextSummaryEndOfDayTicks = SystemClock.UtcNow.Date.AddDays(1).AddHours(1).Ticks }; project.Configuration.Settings.Add("IncludeConditionalData", "true"); project.AddDefaultNotificationSettings(user.Id); project = await _projectRepository.AddAsync(project, o => o.ImmediateConsistency().Cache()).AnyContext(); await _tokenRepository.AddAsync(new List <Token>() { new Token { Id = TEST_API_KEY, OrganizationId = organization.Id, ProjectId = project.Id, CreatedUtc = SystemClock.UtcNow, UpdatedUtc = SystemClock.UtcNow, Type = TokenType.Access }, new Token { Id = TEST_USER_API_KEY, UserId = user.Id, CreatedUtc = SystemClock.UtcNow, UpdatedUtc = SystemClock.UtcNow, Type = TokenType.Access } }, o => o.ImmediateConsistency().Cache()).AnyContext(); user.OrganizationIds.Add(organization.Id); await _userRepository.SaveAsync(user, o => o.ImmediateConsistency().Cache()).AnyContext(); _logger.LogDebug("Created Organization {OrganizationName} and Project {ProjectName}", organization.Name, project.Name); }
public async Task <IActionResult> ChangePlanAsync([FromQuery] string organizationId, [FromQuery] string planId) { if (String.IsNullOrEmpty(organizationId) || !CanAccessOrganization(organizationId)) { return(Ok(new { Success = false, Message = "Invalid Organization Id." })); } var organization = await _organizationRepository.GetByIdAsync(organizationId); if (organization == null) { return(Ok(new { Success = false, Message = "Invalid Organization Id." })); } var plan = BillingManager.GetBillingPlan(planId); if (plan == null) { return(Ok(new { Success = false, Message = "Invalid PlanId." })); } organization.BillingStatus = !String.Equals(plan.Id, BillingManager.FreePlan.Id) ? BillingStatus.Active : BillingStatus.Trialing; organization.RemoveSuspension(); BillingManager.ApplyBillingPlan(organization, plan, CurrentUser, false); await _organizationRepository.SaveAsync(organization); await _messagePublisher.PublishAsync(new PlanChanged { OrganizationId = organization.Id }); return(Ok(new { Success = true })); }
public static Organization GenerateOrganization(bool generateId = false, string name = null, string id = null, string inviteEmail = null, bool isSuspended = false) { var organization = new Organization { Id = id.IsNullOrEmpty() ? generateId ? ObjectId.GenerateNewId().ToString() : TestConstants.OrganizationId : id, Name = name ?? $"Organization{id}" }; BillingManager.ApplyBillingPlan(organization, BillingManager.UnlimitedPlan); if (!String.IsNullOrEmpty(inviteEmail)) { organization.Invites.Add(new Invite { EmailAddress = inviteEmail, Token = Guid.NewGuid().ToString() }); } if (isSuspended) { organization.IsSuspended = true; organization.SuspensionCode = SuspensionCode.Abuse; organization.SuspendedByUserId = TestConstants.UserId; organization.SuspensionDate = DateTime.UtcNow; } return(organization); }
public void CreateSampleOrganizationAndProject(string userId) { if (_projectRepository.GetByApiKey(SAMPLE_API_KEY) != null) { return; } User user = _userRepository.GetByIdCached(userId); var organization = new Organization { Name = "Acme" }; _billingManager.ApplyBillingPlan(organization, BillingManager.UnlimitedPlan, user); organization = _organizationRepository.Add(organization); var project = new Project { Name = "Disintegrating Pistol", TimeZone = TimeZone.CurrentTimeZone.StandardName, OrganizationId = organization.Id }; project.NextSummaryEndOfDayTicks = TimeZoneInfo.ConvertTime(DateTime.Today.AddDays(1), project.DefaultTimeZone()).ToUniversalTime().Ticks; project.ApiKeys.Add(SAMPLE_API_KEY); project.Configuration.Settings.Add("IncludeConditionalData", "true"); project.AddDefaultOwnerNotificationSettings(userId); project = _projectRepository.Add(project); _organizationRepository.IncrementStats(project.OrganizationId, projectCount: 1); user.OrganizationIds.Add(organization.Id); _userRepository.Update(user); }
public IHttpActionResult ChangePlan(string organizationId, string planId) { if (String.IsNullOrEmpty(organizationId) || !CanAccessOrganization(organizationId)) { return(Ok(new { Success = false, Message = "Invalid Organization Id." })); } var organization = _repository.GetById(organizationId); if (organization == null) { return(Ok(new { Success = false, Message = "Invalid Organization Id." })); } var plan = BillingManager.GetBillingPlan(planId); if (plan == null) { return(Ok(new { Success = false, Message = "Invalid PlanId." })); } organization.BillingStatus = !String.Equals(plan.Id, BillingManager.FreePlan.Id) ? BillingStatus.Active : BillingStatus.Trialing; organization.RemoveSuspension(); _billingManager.ApplyBillingPlan(organization, plan, ExceptionlessUser, false); _repository.Save(organization); _messagePublisher.Publish(new PlanChanged { OrganizationId = organization.Id }); return(Ok(new { Success = true })); }
public void CreateTestInternalOrganizationAndProject(string userId) { if (_tokenRepository.GetById(INTERNAL_API_KEY) != null) { return; } User user = _userRepository.GetById(userId, true); var organization = new Organization { Name = "Exceptionless" }; BillingManager.ApplyBillingPlan(organization, BillingManager.UnlimitedPlan, user); organization = _organizationRepository.Add(organization); var project = new Project { Id = INTERNAL_PROJECT_ID, Name = "API", OrganizationId = organization.Id }; project.NextSummaryEndOfDayTicks = DateTime.UtcNow.Date.AddDays(1).AddHours(1).Ticks; project.AddDefaultOwnerNotificationSettings(userId); project = _projectRepository.Add(project, true); _tokenRepository.Add(new Token { Id = INTERNAL_API_KEY, OrganizationId = organization.Id, ProjectId = project.Id, CreatedUtc = DateTime.UtcNow, ModifiedUtc = DateTime.UtcNow, Type = TokenType.Access }); user.OrganizationIds.Add(organization.Id); _userRepository.Save(user, true); }
public JsonResult ChangePlan(string organizationId, string planId) { if (String.IsNullOrEmpty(organizationId) || !User.CanAccessOrganization(organizationId)) { throw new ArgumentException("Invalid organization id.", "organizationId"); // TODO: These should probably throw http Response exceptions. } Organization organization = _repository.GetById(organizationId); if (organization == null) { return(Json(new { Success = false, Message = "Invalid OrganizationId." })); } BillingPlan plan = _billingManager.GetBillingPlan(planId); if (plan == null) { return(Json(new { Success = false, Message = "Invalid PlanId." })); } organization.BillingStatus = !String.Equals(plan.Id, BillingManager.FreePlan.Id) ? BillingStatus.Active : BillingStatus.Trialing; organization.RemoveSuspension(); _billingManager.ApplyBillingPlan(organization, plan, User.UserEntity, false); _repository.Update(organization); _notificationSender.PlanChanged(organization.Id); return(Json(new { Success = true })); }
public string CreateDefaultOrganizationAndProject(User user) { string organizationId = user.OrganizationIds.FirstOrDefault(); if (!String.IsNullOrEmpty(organizationId)) { var defaultProject = _projectRepository.GetByOrganizationId(user.OrganizationIds.First(), useCache: true).FirstOrDefault(); if (defaultProject != null) { return(defaultProject.Id); } } else { var organization = new Organization { Name = "Default Organization" }; _billingManager.ApplyBillingPlan(organization, Settings.Current.EnableBilling ? BillingManager.FreePlan : BillingManager.UnlimitedPlan, user); _organizationRepository.Add(organization); organizationId = organization.Id; } var project = new Project { Name = "Default Project", OrganizationId = organizationId }; project.NextSummaryEndOfDayTicks = DateTime.UtcNow.Date.AddDays(1).AddHours(1).Ticks; project.AddDefaultOwnerNotificationSettings(user.Id); project = _projectRepository.Add(project); _tokenRepository.Add(new Token { Id = Guid.NewGuid().ToString("N"), OrganizationId = organizationId, ProjectId = project.Id, CreatedUtc = DateTime.UtcNow, ModifiedUtc = DateTime.UtcNow, Type = TokenType.Access }); if (!user.OrganizationIds.Contains(organizationId)) { user.OrganizationIds.Add(organizationId); _userRepository.Save(user, true); } return(project.Id); }
private async Task CreateDataAsync() { foreach (var organization in OrganizationData.GenerateSampleOrganizations(_billingManager, _plans)) { if (organization.Id == TestConstants.OrganizationId3) { _billingManager.ApplyBillingPlan(organization, _plans.FreePlan, UserData.GenerateSampleUser()); } else { _billingManager.ApplyBillingPlan(organization, _plans.SmallPlan, UserData.GenerateSampleUser()); } organization.StripeCustomerId = Guid.NewGuid().ToString("N"); organization.CardLast4 = "1234"; organization.SubscribeDate = SystemClock.UtcNow; if (organization.IsSuspended) { organization.SuspendedByUserId = TestConstants.UserId; organization.SuspensionCode = SuspensionCode.Billing; organization.SuspensionDate = SystemClock.UtcNow; } await _organizationRepository.AddAsync(organization, o => o.Cache()); } await _projectRepository.AddAsync(ProjectData.GenerateSampleProjects(), o => o.Cache()); foreach (var user in UserData.GenerateSampleUsers()) { if (user.Id == TestConstants.UserId) { user.OrganizationIds.Add(TestConstants.OrganizationId2); user.OrganizationIds.Add(TestConstants.OrganizationId3); } if (!user.IsEmailAddressVerified) { user.CreateVerifyEmailAddressToken(); } await _userRepository.AddAsync(user, o => o.Cache()); } await _configuration.Client.RefreshAsync(Indices.All); }
public async Task CreateOrganizationAndProjectAsync(string userId) { if (await _tokenRepository.GetByIdAsync(TEST_API_KEY).AnyContext() != null) { return; } var user = await _userRepository.GetByIdAsync(userId, o => o.Cache()).AnyContext(); var organization = new Organization { Id = TEST_ORG_ID, Name = "Acme" }; _billingManager.ApplyBillingPlan(organization, _billingPlans.UnlimitedPlan, user); organization = await _organizationRepository.AddAsync(organization, o => o.Cache()).AnyContext(); var project = new Project { Id = TEST_PROJECT_ID, Name = "Disintegrating Pistol", OrganizationId = organization.Id }; project.NextSummaryEndOfDayTicks = SystemClock.UtcNow.Date.AddDays(1).AddHours(1).Ticks; project.Configuration.Settings.Add("IncludeConditionalData", "true"); project.AddDefaultNotificationSettings(userId); project = await _projectRepository.AddAsync(project, o => o.Cache()).AnyContext(); await _tokenRepository.AddAsync(new Token { Id = TEST_API_KEY, OrganizationId = organization.Id, ProjectId = project.Id, CreatedUtc = SystemClock.UtcNow, UpdatedUtc = SystemClock.UtcNow, Type = TokenType.Access }).AnyContext(); await _tokenRepository.AddAsync(new Token { Id = TEST_USER_API_KEY, UserId = user.Id, CreatedUtc = SystemClock.UtcNow, UpdatedUtc = SystemClock.UtcNow, Type = TokenType.Access }).AnyContext(); user.OrganizationIds.Add(organization.Id); await _userRepository.SaveAsync(user, o => o.Cache()).AnyContext(); }
protected override void CreateData() { foreach (Organization organization in OrganizationData.GenerateSampleOrganizations()) { if (organization.Id == TestConstants.OrganizationId3) { _billingManager.ApplyBillingPlan(organization, BillingManager.FreePlan, UserData.GenerateSampleUser()); } else { _billingManager.ApplyBillingPlan(organization, BillingManager.SmallPlan, UserData.GenerateSampleUser()); } Repository.Add(organization); } foreach (Project project in ProjectData.GenerateSampleProjects()) { var organization = Repository.GetById(project.OrganizationId); organization.ProjectCount += 1; Repository.Update(organization); _projectRepository.Add(project); } var membershipProvider = new MembershipProvider(_userRepository.Collection); foreach (User user in UserData.GenerateSampleUsers()) { if (user.Id == TestConstants.UserId) { user.OrganizationIds.Add(TestConstants.OrganizationId2); user.OrganizationIds.Add(TestConstants.OrganizationId3); } if (user.Id == TestConstants.UserIdWithNoRoles) { user.OrganizationIds.Add(TestConstants.OrganizationId2); } membershipProvider.CreateAccount(user); } }
private void UpgradePlan(Organization organization) { var plan = _billingManager.GetBillingPlan(organization.PlanId); if (plan == null) { Log.LogError("Unable to find a valid plan for organization: {organization}", organization.Id); return; } _billingManager.ApplyBillingPlan(organization, plan, user: null, updateBillingPrice: false); }
private void UpgradePlan(Organization organization) { var plan = BillingManager.GetBillingPlan(organization.PlanId); if (plan == null) { _logger.Error().Message("Unable to find a valid plan for organization: {0}", organization.Id).Write(); return; } BillingManager.ApplyBillingPlan(organization, plan, user: null, updateBillingPrice: false); }
private async Task CreateDataAsync() { await _client.RefreshAsync(); foreach (Organization organization in OrganizationData.GenerateSampleOrganizations()) { if (organization.Id == TestConstants.OrganizationId3) { BillingManager.ApplyBillingPlan(organization, BillingManager.FreePlan, UserData.GenerateSampleUser()); } else { BillingManager.ApplyBillingPlan(organization, BillingManager.SmallPlan, UserData.GenerateSampleUser()); } organization.StripeCustomerId = Guid.NewGuid().ToString("N"); organization.CardLast4 = "1234"; organization.SubscribeDate = DateTime.Now; if (organization.IsSuspended) { organization.SuspendedByUserId = TestConstants.UserId; organization.SuspensionCode = SuspensionCode.Billing; organization.SuspensionDate = DateTime.Now; } await _organizationRepository.AddAsync(organization, true); } await _projectRepository.AddAsync(ProjectData.GenerateSampleProjects(), true); foreach (User user in UserData.GenerateSampleUsers()) { if (user.Id == TestConstants.UserId) { user.OrganizationIds.Add(TestConstants.OrganizationId2); user.OrganizationIds.Add(TestConstants.OrganizationId3); } if (!user.IsEmailAddressVerified) { user.CreateVerifyEmailAddressToken(); } await _userRepository.AddAsync(user, true); } await _client.RefreshAsync(); }
protected override Organization AddModel(Organization value) { BillingManager.ApplyBillingPlan(value, Settings.Current.EnableBilling ? BillingManager.FreePlan : BillingManager.UnlimitedPlan, ExceptionlessUser); var organization = base.AddModel(value); ExceptionlessUser.OrganizationIds.Add(organization.Id); _userRepository.Save(ExceptionlessUser, true); _messagePublisher.Publish(new UserMembershipChanged { UserId = ExceptionlessUser.Id, OrganizationId = organization.Id, ChangeType = ChangeType.Added }); return(organization); }
public void CreateSampleOrganizationAndProject(string userId) { if (_tokenRepository.GetById(SAMPLE_API_KEY) != null) { return; } User user = _userRepository.GetById(userId, true); var organization = new Organization { Id = "537650f3b77efe23a47914f3", Name = "Acme" }; _billingManager.ApplyBillingPlan(organization, BillingManager.UnlimitedPlan, user); organization = _organizationRepository.Add(organization); var project = new Project { Id = "537650f3b77efe23a47914f4", Name = "Disintegrating Pistol", OrganizationId = organization.Id }; project.NextSummaryEndOfDayTicks = DateTime.UtcNow.Date.AddDays(1).AddHours(1).Ticks; project.Configuration.Settings.Add("IncludeConditionalData", "true"); project.AddDefaultOwnerNotificationSettings(userId); project = _projectRepository.Add(project); _tokenRepository.Add(new Token { Id = SAMPLE_API_KEY, OrganizationId = organization.Id, ProjectId = project.Id, ExpiresUtc = DateTime.UtcNow.AddYears(100), CreatedUtc = DateTime.UtcNow, ModifiedUtc = DateTime.UtcNow, Type = TokenType.Access }); _tokenRepository.Add(new Token { Id = SAMPLE_USER_API_KEY, OrganizationId = organization.Id, UserId = user.Id, ExpiresUtc = DateTime.UtcNow.AddYears(100), CreatedUtc = DateTime.UtcNow, ModifiedUtc = DateTime.UtcNow, Type = TokenType.Access }); user.OrganizationIds.Add(organization.Id); _userRepository.Save(user); }
protected override async Task <Organization> AddModelAsync(Organization value) { BillingManager.ApplyBillingPlan(value, Settings.Current.EnableBilling ? BillingManager.FreePlan : BillingManager.UnlimitedPlan, CurrentUser); var organization = await base.AddModelAsync(value); CurrentUser.OrganizationIds.Add(organization.Id); await _userRepository.SaveAsync(CurrentUser, o => o.Cache()); await _messagePublisher.PublishAsync(new UserMembershipChanged { UserId = CurrentUser.Id, OrganizationId = organization.Id, ChangeType = ChangeType.Added }); return(organization); }
public void CreateTestOrganizationAndProject(string userId) { if (_tokenRepository.GetById(TEST_API_KEY) != null) { return; } User user = _userRepository.GetById(userId, true); var organization = new Organization { Id = TEST_ORG_ID, Name = "Acme" }; BillingManager.ApplyBillingPlan(organization, BillingManager.UnlimitedPlan, user); organization = _organizationRepository.Add(organization); var project = new Project { Id = TEST_PROJECT_ID, Name = "Disintegrating Pistol", OrganizationId = organization.Id }; project.NextSummaryEndOfDayTicks = DateTime.UtcNow.Date.AddDays(1).AddHours(1).Ticks; project.Configuration.Settings.Add("IncludeConditionalData", "true"); project.AddDefaultOwnerNotificationSettings(userId); project = _projectRepository.Add(project, true); _tokenRepository.Add(new Token { Id = TEST_API_KEY, OrganizationId = organization.Id, ProjectId = project.Id, CreatedUtc = DateTime.UtcNow, ModifiedUtc = DateTime.UtcNow, Type = TokenType.Access }); _tokenRepository.Add(new Token { Id = TEST_USER_API_KEY, UserId = user.Id, CreatedUtc = DateTime.UtcNow, ModifiedUtc = DateTime.UtcNow, Type = TokenType.Access }); user.OrganizationIds.Add(organization.Id); _userRepository.Save(user, true); }
public async Task CanCleanupEventsOutsideOfRetentionPeriod() { var organization = OrganizationData.GenerateSampleOrganization(_billingManager, _plans); _billingManager.ApplyBillingPlan(organization, _plans.FreePlan); await _organizationRepository.AddAsync(organization, o => o.ImmediateConsistency()); var project = await _projectRepository.AddAsync(ProjectData.GenerateSampleProject(), o => o.ImmediateConsistency()); var stack = await _stackRepository.AddAsync(StackData.GenerateSampleStack(), o => o.ImmediateConsistency()); var options = GetService <AppOptions>(); var date = SystemClock.OffsetUtcNow.SubtractDays(options.MaximumRetentionDays); var persistentEvent = await _eventRepository.AddAsync(EventData.GenerateEvent(organization.Id, project.Id, stack.Id, date, date, date), o => o.ImmediateConsistency()); await _job.RunAsync(); Assert.NotNull(await _organizationRepository.GetByIdAsync(organization.Id)); Assert.NotNull(await _projectRepository.GetByIdAsync(project.Id)); Assert.NotNull(await _stackRepository.GetByIdAsync(stack.Id)); Assert.Null(await _eventRepository.GetByIdAsync(persistentEvent.Id, o => o.IncludeSoftDeletes())); }
public async Task CreateInternalOrganizationAndProjectAsync(string userId) { if (await _tokenRepository.GetByIdAsync(INTERNAL_API_KEY).AnyContext() != null) { return; } User user = await _userRepository.GetByIdAsync(userId, true).AnyContext(); var organization = new Organization { Name = "Exceptionless" }; BillingManager.ApplyBillingPlan(organization, BillingManager.UnlimitedPlan, user); organization = await _organizationRepository.AddAsync(organization, true).AnyContext(); var project = new Project { Id = INTERNAL_PROJECT_ID, Name = "API", OrganizationId = organization.Id }; project.NextSummaryEndOfDayTicks = SystemClock.UtcNow.Date.AddDays(1).AddHours(1).Ticks; project.AddDefaultOwnerNotificationSettings(userId); project = await _projectRepository.AddAsync(project, true).AnyContext(); await _tokenRepository.AddAsync(new Token { Id = INTERNAL_API_KEY, OrganizationId = organization.Id, ProjectId = project.Id, CreatedUtc = SystemClock.UtcNow, ModifiedUtc = SystemClock.UtcNow, Type = TokenType.Access }).AnyContext(); user.OrganizationIds.Add(organization.Id); await _userRepository.SaveAsync(user, true).AnyContext(); }
protected override Organization InsertEntity(Organization value) { if (String.IsNullOrEmpty(value.Name)) { throw new HttpResponseException(BadRequestErrorResponseMessage()); } if (!IsNameAvailable(value.Name)) { throw new HttpResponseException(DuplicateResponseMessage(value.Id)); } if (!_billingManager.CanAddOrganization(User.UserEntity)) { throw new HttpResponseException(PlanLimitReached("Please upgrade your plan to add an additional organization.")); } _billingManager.ApplyBillingPlan(value, Settings.Current.EnableBilling ? BillingManager.FreePlan : BillingManager.UnlimitedPlan, User.UserEntity); value.ProjectCount = 0; value.StackCount = 0; value.ErrorCount = 0; value.TotalErrorCount = 0; // TODO: User can currently specify the organization id to insert. Organization organization = base.InsertEntity(value); User user = _userRepository.GetById(User.UserEntity.Id); user.OrganizationIds.Add(organization.Id); _userRepository.Update(user); _notificationSender.OrganizationUpdated(organization.Id); return(organization); }
public JsonResult ChangePlan(string organizationId, string planId, string stripeToken, string last4) { if (String.IsNullOrEmpty(organizationId) || !User.CanAccessOrganization(organizationId)) { throw new ArgumentException("Invalid organization id.", "organizationId"); // TODO: These should probably throw http Response exceptions. } if (!Settings.Current.EnableBilling) { return(Json(new { Success = false, Message = "Plans cannot be changed while billing is disabled." })); } Organization organization = _repository.GetById(organizationId); if (organization == null) { return(Json(new { Success = false, Message = "Invalid OrganizationId." })); } BillingPlan plan = _billingManager.GetBillingPlan(planId); if (plan == null) { return(Json(new { Success = false, Message = "Invalid PlanId." })); } if (String.Equals(organization.PlanId, plan.Id) && String.Equals(BillingManager.FreePlan.Id, plan.Id)) { return(Json(new { Success = true, Message = "Your plan was not changed as you were already on the free plan." })); } // Only see if they can downgrade a plan if the plans are different. string message; if (!String.Equals(organization.PlanId, plan.Id) && !_billingManager.CanDownGrade(organization, plan, User.UserEntity, out message)) { return(Json(new { Success = false, Message = message })); } var customerService = new StripeCustomerService(); try { // If they are on a paid plan and then downgrade to a free plan then cancel their stripe subscription. if (!String.Equals(organization.PlanId, BillingManager.FreePlan.Id) && String.Equals(plan.Id, BillingManager.FreePlan.Id)) { if (!String.IsNullOrEmpty(organization.StripeCustomerId)) { customerService.CancelSubscription(organization.StripeCustomerId); } organization.BillingStatus = BillingStatus.Trialing; organization.RemoveSuspension(); } else if (String.IsNullOrEmpty(organization.StripeCustomerId)) { if (String.IsNullOrEmpty(stripeToken)) { return(Json(new { Success = false, Message = "Billing information was not set." })); } organization.SubscribeDate = DateTime.Now; StripeCustomer customer = customerService.Create(new StripeCustomerCreateOptions { TokenId = stripeToken, PlanId = planId, Description = organization.Name }); organization.BillingStatus = BillingStatus.Active; organization.RemoveSuspension(); organization.StripeCustomerId = customer.Id; if (customer.StripeCardList.StripeCards.Count > 0) { organization.CardLast4 = customer.StripeCardList.StripeCards[0].Last4; } } else { var update = new StripeCustomerUpdateSubscriptionOptions { PlanId = planId }; bool cardUpdated = false; if (!String.IsNullOrEmpty(stripeToken)) { update.TokenId = stripeToken; cardUpdated = true; } customerService.UpdateSubscription(organization.StripeCustomerId, update); if (cardUpdated) { organization.CardLast4 = last4; } organization.BillingStatus = BillingStatus.Active; organization.RemoveSuspension(); } _billingManager.ApplyBillingPlan(organization, plan, User.UserEntity); _repository.Update(organization); _notificationSender.PlanChanged(organization.Id); } catch (Exception e) { Log.Error().Exception(e).Message("An error occurred while trying to update your billing plan: " + e.Message).Report().Write(); return(Json(new { Success = false, Message = e.Message })); } return(Json(new { Success = true })); }
public async Task <IHttpActionResult> ChangePlanAsync(string id, string planId, string stripeToken = null, string last4 = null, string couponId = null) { if (String.IsNullOrEmpty(id) || !CanAccessOrganization(id)) { return(NotFound()); } if (!Settings.Current.EnableBilling) { return(Ok(ChangePlanResult.FailWithMessage("Plans cannot be changed while billing is disabled."))); } var organization = await GetModelAsync(id, false); if (organization == null) { return(Ok(ChangePlanResult.FailWithMessage("Invalid OrganizationId."))); } var plan = BillingManager.GetBillingPlan(planId); if (plan == null) { return(Ok(ChangePlanResult.FailWithMessage("Invalid PlanId."))); } if (String.Equals(organization.PlanId, plan.Id) && String.Equals(BillingManager.FreePlan.Id, plan.Id)) { return(Ok(ChangePlanResult.SuccessWithMessage("Your plan was not changed as you were already on the free plan."))); } // Only see if they can downgrade a plan if the plans are different. if (!String.Equals(organization.PlanId, plan.Id)) { var result = await _billingManager.CanDownGradeAsync(organization, plan, CurrentUser); if (!result.Success) { return(Ok(result)); } } var customerService = new StripeCustomerService(Settings.Current.StripeApiKey); var subscriptionService = new StripeSubscriptionService(Settings.Current.StripeApiKey); try { // If they are on a paid plan and then downgrade to a free plan then cancel their stripe subscription. if (!String.Equals(organization.PlanId, BillingManager.FreePlan.Id) && String.Equals(plan.Id, BillingManager.FreePlan.Id)) { if (!String.IsNullOrEmpty(organization.StripeCustomerId)) { var subs = await subscriptionService.ListAsync(new StripeSubscriptionListOptions { CustomerId = organization.StripeCustomerId }); foreach (var sub in subs.Where(s => !s.CanceledAt.HasValue)) { await subscriptionService.CancelAsync(sub.Id); } } organization.BillingStatus = BillingStatus.Trialing; organization.RemoveSuspension(); } else if (String.IsNullOrEmpty(organization.StripeCustomerId)) { if (String.IsNullOrEmpty(stripeToken)) { return(Ok(ChangePlanResult.FailWithMessage("Billing information was not set."))); } organization.SubscribeDate = SystemClock.UtcNow; var createCustomer = new StripeCustomerCreateOptions { SourceToken = stripeToken, PlanId = planId, Description = organization.Name, Email = CurrentUser.EmailAddress }; if (!String.IsNullOrWhiteSpace(couponId)) { createCustomer.CouponId = couponId; } var customer = await customerService.CreateAsync(createCustomer); organization.BillingStatus = BillingStatus.Active; organization.RemoveSuspension(); organization.StripeCustomerId = customer.Id; if (customer.Sources.TotalCount > 0) { organization.CardLast4 = customer.Sources.Data.First().Card.Last4; } } else { var update = new StripeSubscriptionUpdateOptions { PlanId = planId }; var create = new StripeSubscriptionCreateOptions(); bool cardUpdated = false; if (!String.IsNullOrEmpty(stripeToken)) { update.Source = stripeToken; create.Source = stripeToken; cardUpdated = true; } var subscriptionList = await subscriptionService.ListAsync(new StripeSubscriptionListOptions { CustomerId = organization.StripeCustomerId }); var subscription = subscriptionList.FirstOrDefault(s => !s.CanceledAt.HasValue); if (subscription != null) { await subscriptionService.UpdateAsync(subscription.Id, update); } else { await subscriptionService.CreateAsync(organization.StripeCustomerId, planId, create); } await customerService.UpdateAsync(organization.StripeCustomerId, new StripeCustomerUpdateOptions { Email = CurrentUser.EmailAddress }); if (cardUpdated) { organization.CardLast4 = last4; } organization.BillingStatus = BillingStatus.Active; organization.RemoveSuspension(); } BillingManager.ApplyBillingPlan(organization, plan, CurrentUser); await _repository.SaveAsync(organization, o => o.Cache()); await _messagePublisher.PublishAsync(new PlanChanged { OrganizationId = organization.Id }); } catch (Exception e) { _logger.Error().Exception(e).Message("An error occurred while trying to update your billing plan: " + e.Message).Critical().Identity(CurrentUser.EmailAddress).Property("User", CurrentUser).SetActionContext(ActionContext).Write(); return(Ok(ChangePlanResult.FailWithMessage(e.Message))); } return(Ok(new ChangePlanResult { Success = true })); }
public async Task <ActionResult <ChangePlanResult> > ChangePlanAsync(string id, string planId, string stripeToken = null, string last4 = null, string couponId = null) { if (String.IsNullOrEmpty(id) || !CanAccessOrganization(id)) { return(NotFound()); } if (!_options.StripeOptions.EnableBilling) { return(Ok(ChangePlanResult.FailWithMessage("Plans cannot be changed while billing is disabled."))); } var organization = await GetModelAsync(id, false); if (organization == null) { return(Ok(ChangePlanResult.FailWithMessage("Invalid OrganizationId."))); } var plan = _billingManager.GetBillingPlan(planId); if (plan == null) { return(Ok(ChangePlanResult.FailWithMessage("Invalid PlanId."))); } if (String.Equals(organization.PlanId, plan.Id) && String.Equals(_plans.FreePlan.Id, plan.Id)) { return(Ok(ChangePlanResult.SuccessWithMessage("Your plan was not changed as you were already on the free plan."))); } // Only see if they can downgrade a plan if the plans are different. if (!String.Equals(organization.PlanId, plan.Id)) { var result = await _billingManager.CanDownGradeAsync(organization, plan, CurrentUser); if (!result.Success) { return(Ok(result)); } } var client = new StripeClient(_options.StripeOptions.StripeApiKey); var customerService = new CustomerService(client); var subscriptionService = new SubscriptionService(client); try { // If they are on a paid plan and then downgrade to a free plan then cancel their stripe subscription. if (!String.Equals(organization.PlanId, _plans.FreePlan.Id) && String.Equals(plan.Id, _plans.FreePlan.Id)) { if (!String.IsNullOrEmpty(organization.StripeCustomerId)) { var subs = await subscriptionService.ListAsync(new SubscriptionListOptions { Customer = organization.StripeCustomerId }); foreach (var sub in subs.Where(s => !s.CanceledAt.HasValue)) { await subscriptionService.CancelAsync(sub.Id, new SubscriptionCancelOptions()); } } organization.BillingStatus = BillingStatus.Trialing; organization.RemoveSuspension(); } else if (String.IsNullOrEmpty(organization.StripeCustomerId)) { if (String.IsNullOrEmpty(stripeToken)) { return(Ok(ChangePlanResult.FailWithMessage("Billing information was not set."))); } organization.SubscribeDate = SystemClock.UtcNow; var createCustomer = new CustomerCreateOptions { Source = stripeToken, Plan = planId, Description = organization.Name, Email = CurrentUser.EmailAddress }; if (!String.IsNullOrWhiteSpace(couponId)) { createCustomer.Coupon = couponId; } var customer = await customerService.CreateAsync(createCustomer); organization.BillingStatus = BillingStatus.Active; organization.RemoveSuspension(); organization.StripeCustomerId = customer.Id; organization.CardLast4 = last4; } else { var update = new SubscriptionUpdateOptions { Items = new List <SubscriptionItemOptions>() }; var create = new SubscriptionCreateOptions { Customer = organization.StripeCustomerId, Items = new List <SubscriptionItemOptions>() }; bool cardUpdated = false; var customerUpdateOptions = new CustomerUpdateOptions { Description = organization.Name }; if (!Request.IsGlobalAdmin()) { customerUpdateOptions.Email = CurrentUser.EmailAddress; } if (!String.IsNullOrEmpty(stripeToken)) { customerUpdateOptions.Source = stripeToken; cardUpdated = true; } await customerService.UpdateAsync(organization.StripeCustomerId, customerUpdateOptions); var subscriptionList = await subscriptionService.ListAsync(new SubscriptionListOptions { Customer = organization.StripeCustomerId }); var subscription = subscriptionList.FirstOrDefault(s => !s.CanceledAt.HasValue); if (subscription != null) { update.Items.Add(new SubscriptionItemOptions { Id = subscription.Items.Data[0].Id, Plan = planId }); await subscriptionService.UpdateAsync(subscription.Id, update); } else { create.Items.Add(new SubscriptionItemOptions { Plan = planId }); await subscriptionService.CreateAsync(create); } if (cardUpdated) { organization.CardLast4 = last4; } organization.BillingStatus = BillingStatus.Active; organization.RemoveSuspension(); } _billingManager.ApplyBillingPlan(organization, plan, CurrentUser); await _repository.SaveAsync(organization, o => o.Cache()); await _messagePublisher.PublishAsync(new PlanChanged { OrganizationId = organization.Id }); } catch (Exception ex) { using (_logger.BeginScope(new ExceptionlessState().Tag("Change Plan").Identity(CurrentUser.EmailAddress).Property("User", CurrentUser).SetHttpContext(HttpContext))) _logger.LogCritical(ex, "An error occurred while trying to update your billing plan: {Message}", ex.Message); return(Ok(ChangePlanResult.FailWithMessage(ex.Message))); } return(Ok(new ChangePlanResult { Success = true })); }
public ActionResult Add(ProjectModel model) { ViewBag.Organizations = Organizations; ViewBag.HasOrganizations = Organizations.Any(); ViewBag.TimeZones = TimeZoneInfo.GetSystemTimeZones(); #region Validation Organization organization = null; if (!String.IsNullOrEmpty(model.OrganizationName)) { Organization existing = Organizations.FirstOrDefault(o => o.Name == model.OrganizationName); organization = existing ?? new Organization { Name = model.OrganizationName.Trim() }; } else if (!String.IsNullOrEmpty(model.OrganizationId)) { organization = Organizations.FirstOrDefault(o => o.Id == model.OrganizationId); ModelState state = ModelState["OrganizationName"]; if (state != null) { state.Errors.Clear(); } } if (!ModelState.IsValid) { return(View(model)); } if (organization == null) { ModelState.AddModelError("OrganizationName", "Organization Name is required."); return(View(model)); } if (!String.IsNullOrEmpty(organization.Id) && Projects.Count(p => p.OrganizationId == organization.Id && String.Equals(p.Name, model.Name, StringComparison.OrdinalIgnoreCase)) > 0) { ModelState.AddModelError("Name", "A project with this name already exists."); return(View(model)); } #endregion var user = GetUser(); if (String.IsNullOrEmpty(organization.Id)) { if (!_billingManager.CanAddOrganization(user)) { ModelState.AddModelError(String.Empty, "Please upgrade your plan to add an additional organization."); return(View(model)); } _billingManager.ApplyBillingPlan(organization, Settings.Current.EnableBilling ? BillingManager.FreePlan : BillingManager.UnlimitedPlan, user); organization = _organizationRepository.Add(organization, true); user.OrganizationIds.Add(organization.Id); _userRepository.Save(user); } var project = new Project { Name = model.Name, TimeZone = model.TimeZone, OrganizationId = organization.Id }; project.NextSummaryEndOfDayTicks = TimeZoneInfo.ConvertTime(DateTime.Today.AddDays(1), project.DefaultTimeZone()).ToUniversalTime().Ticks; project.ApiKeys.Add(Guid.NewGuid().ToString("N").ToLower()); project.AddDefaultOwnerNotificationSettings(user.Id); if (!_billingManager.CanAddProject(project)) { ModelState.AddModelError(String.Empty, "Please upgrade your plan to add an additional project."); return(View(model)); } project = _projectRepository.Add(project); _organizationRepository.IncrementStats(project.OrganizationId, projectCount: 1); return(RedirectToAction("Configure", "Project", new { id = project.Id })); }
public IHttpActionResult ChangePlan(string id, string planId, string stripeToken = null, string last4 = null, string couponId = null) { if (String.IsNullOrEmpty(id) || !CanAccessOrganization(id)) { return(BadRequest("Invalid organization id.")); } if (!Settings.Current.EnableBilling) { return(Ok(new { Success = false, Message = "Plans cannot be changed while billing is disabled." })); } Organization organization = _repository.GetById(id); if (organization == null) { return(Ok(new { Success = false, Message = "Invalid OrganizationId." })); } BillingPlan plan = BillingManager.GetBillingPlan(planId); if (plan == null) { return(Ok(new { Success = false, Message = "Invalid PlanId." })); } if (String.Equals(organization.PlanId, plan.Id) && String.Equals(BillingManager.FreePlan.Id, plan.Id)) { return(Ok(new { Success = true, Message = "Your plan was not changed as you were already on the free plan." })); } // Only see if they can downgrade a plan if the plans are different. string message; if (!String.Equals(organization.PlanId, plan.Id) && !_billingManager.CanDownGrade(organization, plan, ExceptionlessUser, out message)) { return(Ok(new { Success = false, Message = message })); } var customerService = new StripeCustomerService(); var subscriptionService = new StripeSubscriptionService(); try { // If they are on a paid plan and then downgrade to a free plan then cancel their stripe subscription. if (!String.Equals(organization.PlanId, BillingManager.FreePlan.Id) && String.Equals(plan.Id, BillingManager.FreePlan.Id)) { if (!String.IsNullOrEmpty(organization.StripeCustomerId)) { var subs = subscriptionService.List(organization.StripeCustomerId).Where(s => !s.CanceledAt.HasValue); foreach (var sub in subs) { subscriptionService.Cancel(organization.StripeCustomerId, sub.Id); } } organization.BillingStatus = BillingStatus.Trialing; organization.RemoveSuspension(); } else if (String.IsNullOrEmpty(organization.StripeCustomerId)) { if (String.IsNullOrEmpty(stripeToken)) { return(Ok(new { Success = false, Message = "Billing information was not set." })); } organization.SubscribeDate = DateTime.Now; var createCustomer = new StripeCustomerCreateOptions { TokenId = stripeToken, PlanId = planId, Description = organization.Name, Email = ExceptionlessUser.EmailAddress }; if (!String.IsNullOrWhiteSpace(couponId)) { createCustomer.CouponId = couponId; } StripeCustomer customer = customerService.Create(createCustomer); organization.BillingStatus = BillingStatus.Active; organization.RemoveSuspension(); organization.StripeCustomerId = customer.Id; if (customer.StripeCardList.StripeCards.Count > 0) { organization.CardLast4 = customer.StripeCardList.StripeCards[0].Last4; } } else { var update = new StripeSubscriptionUpdateOptions { PlanId = planId }; var create = new StripeSubscriptionCreateOptions(); bool cardUpdated = false; if (!String.IsNullOrEmpty(stripeToken)) { update.TokenId = stripeToken; create.TokenId = stripeToken; cardUpdated = true; } var subscription = subscriptionService.List(organization.StripeCustomerId).FirstOrDefault(s => !s.CanceledAt.HasValue); if (subscription != null) { subscriptionService.Update(organization.StripeCustomerId, subscription.Id, update); } else { subscriptionService.Create(organization.StripeCustomerId, planId, create); } customerService.Update(organization.StripeCustomerId, new StripeCustomerUpdateOptions { Email = ExceptionlessUser.EmailAddress }); if (cardUpdated) { organization.CardLast4 = last4; } organization.BillingStatus = BillingStatus.Active; organization.RemoveSuspension(); } _billingManager.ApplyBillingPlan(organization, plan, ExceptionlessUser); _repository.Save(organization); _messagePublisher.Publish(new PlanChanged { OrganizationId = organization.Id }); } catch (Exception e) { Log.Error().Exception(e).Message("An error occurred while trying to update your billing plan: " + e.Message).Report(r => r.MarkAsCritical()).Write(); return(Ok(new { Success = false, Message = e.Message })); } return(Ok(new { Success = true })); }