private async Task <Tuple <Organization, OrganizationUser> > SignUpAsync(Organization organization, Guid ownerId, string ownerKey, string collectionName, bool withPayment) { try { await _organizationRepository.CreateAsync(organization); var orgUser = new OrganizationUser { OrganizationId = organization.Id, UserId = ownerId, Key = ownerKey, Type = OrganizationUserType.Owner, Status = OrganizationUserStatusType.Confirmed, AccessAll = true, CreationDate = organization.CreationDate, RevisionDate = organization.CreationDate }; await _organizationUserRepository.CreateAsync(orgUser); if (!string.IsNullOrWhiteSpace(collectionName)) { var defaultCollection = new Collection { Name = collectionName, OrganizationId = organization.Id, CreationDate = organization.CreationDate, RevisionDate = organization.CreationDate }; await _collectionRepository.CreateAsync(defaultCollection); } // push var deviceIds = await GetUserDeviceIdsAsync(orgUser.UserId.Value); await _pushRegistrationService.AddUserRegistrationOrganizationAsync(deviceIds, organization.Id.ToString()); await _pushNotificationService.PushSyncOrgKeysAsync(ownerId); return(new Tuple <Organization, OrganizationUser>(organization, orgUser)); } catch { if (organization.Id != default(Guid)) { await _organizationRepository.DeleteAsync(organization); } throw; } }
public async Task PutAddOrganization([FromBody] PushUpdateRequestModel model) { CheckUsage(); await _pushRegistrationService.AddUserRegistrationOrganizationAsync( model.DeviceIds.Select(d => Prefix(d)), Prefix(model.OrganizationId)); }
public async Task <Tuple <Organization, OrganizationUser> > SignUpAsync(OrganizationSignup signup) { var plan = StaticStore.Plans.FirstOrDefault(p => p.Type == signup.Plan && !p.Disabled); if (plan == null) { throw new BadRequestException("Plan not found."); } var customerService = new StripeCustomerService(); var subscriptionService = new StripeSubscriptionService(); StripeCustomer customer = null; StripeSubscription subscription = null; if (plan.BaseSeats + signup.AdditionalSeats <= 0) { throw new BadRequestException("You do not have any seats!"); } if (!plan.CanBuyAdditionalSeats && signup.AdditionalSeats > 0) { throw new BadRequestException("Plan does not allow additional users."); } if (plan.CanBuyAdditionalSeats && plan.MaxAdditionalSeats.HasValue && signup.AdditionalSeats > plan.MaxAdditionalSeats.Value) { throw new BadRequestException($"Selected plan allows a maximum of " + $"{plan.MaxAdditionalSeats.GetValueOrDefault(0)} additional users."); } // Pre-generate the org id so that we can save it with the Stripe subscription.. Guid newOrgId = CoreHelpers.GenerateComb(); if (plan.Type == PlanType.Free) { var ownerExistingOrgCount = await _organizationUserRepository.GetCountByFreeOrganizationAdminUserAsync(signup.Owner.Id); if (ownerExistingOrgCount > 0) { throw new BadRequestException("You can only be an admin of one free organization."); } } else { customer = await customerService.CreateAsync(new StripeCustomerCreateOptions { Description = signup.BusinessName, Email = signup.BillingEmail, SourceToken = signup.PaymentToken }); var subCreateOptions = new StripeSubscriptionCreateOptions { TrialPeriodDays = plan.TrialPeriodDays, Items = new List <StripeSubscriptionItemOption>(), Metadata = new Dictionary <string, string> { { "organizationId", newOrgId.ToString() } } }; if (plan.StripePlanId != null) { subCreateOptions.Items.Add(new StripeSubscriptionItemOption { PlanId = plan.StripePlanId, Quantity = 1 }); } if (signup.AdditionalSeats > 0 && plan.StripeSeatPlanId != null) { subCreateOptions.Items.Add(new StripeSubscriptionItemOption { PlanId = plan.StripeSeatPlanId, Quantity = signup.AdditionalSeats }); } try { subscription = await subscriptionService.CreateAsync(customer.Id, subCreateOptions); } catch (StripeException) { if (customer != null) { await customerService.DeleteAsync(customer.Id); } throw; } } var organization = new Organization { Id = newOrgId, Name = signup.Name, BillingEmail = signup.BillingEmail, BusinessName = signup.BusinessName, PlanType = plan.Type, Seats = (short)(plan.BaseSeats + signup.AdditionalSeats), MaxCollections = plan.MaxCollections, UseGroups = plan.UseGroups, UseDirectory = plan.UseDirectory, Plan = plan.Name, StripeCustomerId = customer?.Id, StripeSubscriptionId = subscription?.Id, Enabled = true, CreationDate = DateTime.UtcNow, RevisionDate = DateTime.UtcNow }; try { await _organizationRepository.CreateAsync(organization); var orgUser = new OrganizationUser { OrganizationId = organization.Id, UserId = signup.Owner.Id, Key = signup.OwnerKey, Type = OrganizationUserType.Owner, Status = OrganizationUserStatusType.Confirmed, AccessAll = true, CreationDate = DateTime.UtcNow, RevisionDate = DateTime.UtcNow }; await _organizationUserRepository.CreateAsync(orgUser); // push await _pushRegistrationService.AddUserRegistrationOrganizationAsync(orgUser.UserId.Value, organization.Id); await _pushNotificationService.PushSyncOrgKeysAsync(signup.Owner.Id); return(new Tuple <Organization, OrganizationUser>(organization, orgUser)); } catch { if (subscription != null) { await subscriptionService.CancelAsync(subscription.Id, false); } if (customer != null) { var chargeService = new StripeChargeService(); var charges = await chargeService.ListAsync(new StripeChargeListOptions { CustomerId = customer.Id }); if (charges?.Data != null) { var refundService = new StripeRefundService(); foreach (var charge in charges.Data.Where(c => !c.Refunded)) { await refundService.CreateAsync(charge.Id); } } await customerService.DeleteAsync(customer.Id); } if (organization.Id != default(Guid)) { await _organizationRepository.DeleteAsync(organization); } throw; } }