Пример #1
0
        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);
            }
        }
Пример #2
0
        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);
            }
        }
Пример #3
0
        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);
        }
Пример #4
0
        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 }));
        }
Пример #5
0
        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);
        }
Пример #6
0
        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);
        }
Пример #7
0
        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 }));
        }
Пример #8
0
        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);
        }
Пример #9
0
        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 }));
        }
Пример #10
0
        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);
        }
Пример #11
0
        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);
            }
        }
Пример #14
0
        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);
        }
Пример #16
0
        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);
        }
Пример #18
0
        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);
        }
Пример #19
0
        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);
        }
Пример #20
0
        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);
        }
Пример #21
0
    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()));
    }
Пример #22
0
        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();
        }
Пример #23
0
        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);
        }
Пример #24
0
        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 }));
        }
Пример #25
0
        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
            }));
        }
Пример #27
0
        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 }));
        }