Ejemplo n.º 1
0
        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;
            }
        }
Ejemplo n.º 2
0
        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;
            }
        }